win32下的静态文本控件看似简单,但是要理解也麻烦,主要是它的SS Style比较多,不光能仅仅显示文本,还能显示静态图像等等.
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
case WM_CREATE:
{
LPCREATESTRUCT lp = (LPCREATESTRUCT)lParam;
//创建子窗口 -- 静态文本
HWND hwnd2 = CreateWindow(L"static", L"静态文本内容", WS_CHILD | WS_VISIBLE | SS_BITMAP, 30, 30, 400, 50, hwnd, (HMENU)1000, lp->hInstance,NULL);
//更改静态文本内容
SetWindowText(hwnd2, L"更改后的静态文本控件内容!");
//从rc加载Bitmap
HBITMAP hBitmp = LoadBitmap(lp->hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
//设置位图 -- 发送Message
SendMessage(hwnd2, STM_SETIMAGE ,(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmp);
}
break;
default:
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hInstance = hInstance;
wnd.hCursor = LoadCursor(hInstance, IDC_ARROW);
wnd.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wnd.lpszClassName = L"018";
wnd.lpszMenuName = NULL;
wnd.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wnd.lpfnWndProc = MyWndProc;
int ec = RegisterClass(&wnd);
if ( ec == 0)
{
ec = GetLastError();
return 0;
}
//2.创建窗口
HWND hwnd = CreateWindow(L"018", L"window title", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL);
if ( hwnd == NULL )
{
//create wnd fail
return 0;
}
//3.显示窗口
UpdateWindow(hwnd);
ShowWindow(hwnd, nShowCmd);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
首先我们看标准写法:
在自己定义的窗口函数中,在收到WM_CREATE后我们开始创建子窗口:
LPCREATESTRUCT lp = (LPCREATESTRUCT)lParam;
//创建子窗口 -- 静态文本
HWND hwnd2 = CreateWindow(L"static", L"静态文本内容", WS_CHILD | WS_VISIBLE | SS_SIMPLE, 30, 30, 400, 50, hwnd, (HMENU)1000, lp->hInstance,NULL);
注意静态文本的样式都是以:SS开头,表示STATIC SHOW.
SS_SIMPLE表示只是一段简单的文本内容.
如果我们要调整静态文本控件的标题,那么我们可以调用:
//更改静态文本内容
SetWindowText(hwnd2, L"更改后的静态文本控件内容!");
//更改窗口的标题,默认内容是window title
SetWindowText(hwnd, L"更改窗口标题");
上面的代码同样可以设置窗口的标题,效果如下:
静态文本控件,除了可以显示文本外,也可以显示静态的位图图片,但是我们需要修改它的窗口样式:
HWND hwnd2 = CreateWindow(L"static", L"静态文本内容", WS_CHILD | WS_VISIBLE | SS_BITMAP , 30, 30, 400, 50, hwnd, (HMENU)1000, lp->hInstance,NULL);
这里需要将SS_SIMPLE改为SS_BITMAP,表示当前的静态控件是一个静态图片控件,接下来我们需要设置它要显示的图片资源.
实现方式还是和以前,直接调用SendMessage给控件发送消息(阻塞操作,操作完成后函数返回).
//从rc加载Bitmap
HBITMAP hBitmp = LoadBitmap(lp->hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
//设置位图 -- 发送Message
SendMessage(hwnd2, STM_SETIMAGE ,(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmp);
如果我们要处理静态控件,被点击后的事件,需要添加窗口属性SS_NOTIFY.
HWND hwnd2 = CreateWindow(L"static", L"静态文本内容", WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_NOTIFY , 30, 30, 400, 50, hwnd, (HMENU)1000, lp->hInstance,NULL);
处理被点击的时间,STN_CLICKED.
case WM_COMMAND:
{
int nCode = HIWORD(wParam);//控件的消息类型
int ctrID = LOWORD(wParam);//控件的ID
if (ctrID == 1000 && nCode == STN_CLICKED)
{
MessageBox(hwnd, L"静态图片被点击了!", L"提示", MB_OK);
}
}
效果如图所示: