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); } }
效果如圖所示: