WIN32下的靜態文本控件

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);
		}
	}

效果如圖所示:

在這裏插入圖片描述