WIN32下的静态文本控件

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

效果如图所示:

在这里插入图片描述