win32下的静态文本控件看似简单,可是要理解也麻烦,主要是它的SS Style比较多,不光能仅仅显示文本,还能显示静态图像等等.web
#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; }
首先咱们看标准写法:windows
在本身定义的窗口函数中,在收到WM_CREATE后咱们开始建立子窗口:svg
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表示只是一段简单的文本内容.ui
若是咱们要调整静态文本控件的标题,那么咱们能够调用:spa
//更改静态文本内容 SetWindowText(hwnd2, L"更改后的静态文本控件内容!"); //更改窗口的标题,默认内容是window title SetWindowText(hwnd, L"更改窗口标题");
上面的代码一样能够设置窗口的标题,效果以下:code
静态文本控件,除了能够显示文本外,也能够显示静态的位图图片,可是咱们须要修改它的窗口样式:xml
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,表示当前的静态控件是一个静态图片控件,接下来咱们须要设置它要显示的图片资源.blog
实现方式仍是和之前,直接调用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); } }
效果如图所示: