Win32学习 (十三)文本绘制 对话框

文本绘制
文字的绘制
1)TextOut - 将文字绘制在指定坐标位置
2)int DrawText(
HDC hDC, //DC句柄
LPCTSTR IpString,//字符串
int nCount, //字符数量
LPRECT IpRect, //绘制文字的矩形框
UINT uFormat //绘制的方法
);
文字颜色和背景
文字颜色:SetTextColor
文字背景色:SetBkColor
文字背景模式:SetBkMode(OPAQUE/TRANSPARENT)

字体相关
Window常用的字体为 TrueType格式的字体文件
字体名 - 标识字体类型
HFONT - 字体句柄
1.创建字体
HFONT CreateFont(
int nHeight,//字体高度
int nWidth, //字体宽度
int nEscapement,//字符串倾斜角度
int nOrientation,//字符旋转角度
int fnWeight,//字体的粗细
DWORD fdwItalic,//倾斜
DWORD fdwUnderline,//字符下划线
DWORD fdwStrikeOut,//删除线
DWORD fdwCharSet,//字符集
DWORD fdwOutputPrecision,//输出精度
DWORD fdwClipPrecision,//剪切精度
DWORD fdwQuality,//输出质量
DWORD fdwPitchAndFamily,//匹配字体
LPCTSTR lpszFace //字体名称
);
2:应用字体到DC
SelectObject
3:绘制文字
DrawText/TextOut
4:取出字体
SelectObject
5:删除字体
DeleteObject

#include <windows.h>
void OnPaint(HWND hWnd) {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = BeginPaint(hWnd, &ps);

	SetTextColor(hdc, RGB(255, 0, 0));
	SetBkColor(hdc, RGB(0, 255, 0));
	SetBkMode(hdc, TRANSPARENT);
	HFONT hFont = CreateFont(30, 0, 45, 0, 900, 1, 1, 1, GB2312_CHARSET, 0, 0, 0, 0, "黑体");
	HGDIOBJ nOldFont = SelectObject(hdc, hFont);

	char szText[] = "hello txt";

	TextOut(hdc, 100, 100, szText, strlen(szText));

	RECT rc;
	rc.left = 100;
	rc.top = 150;
	rc.right = 200;
	rc.bottom = 200;
	Rectangle(hdc, 100, 150, 200, 200);
	DrawText(hdc, szText, strlen(szText), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP );
	//DT_LEFT | DT_TOP | DT_WORDBREAK 多行(多行和垂直居中冲突,达不到效果))| DT_NOCLIP 不裁切 DT_VCENTER / DT_BOTTOM 只适用DT_SINGLELINE 和 DT_WORDREAK冲突
	SelectObject(hdc, nOldFont);
	DeleteObject(hFont);
	EndPaint(hWnd, &ps);
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM IParam)
{
	switch (msgID) {
	case WM_PAINT:
		OnPaint(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, msgID, wParam, IParam);
}

int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = "Main";
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc); //将以上所有赋值全部写入操作系统中
	//在内存创建窗口
	HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL
		, hIns
		, NULL);

	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, NULL, 0, 0)) { //抓消息
		TranslateMessage(&nMsg);//翻译消息
		DispatchMessage(&nMsg);//派发消息:将消息交给窗口处理函数来处理。
	}

	return 0;
}
//需要在任务管理器中退出线程!


对话框
对话框的分类
模式对话框 - 当对话框显示时,会禁止其他窗口和用户交互操作
无模式对话框 - 在对话框显示后,其他窗口仍然可以和用户交互操作
对话框基本使用
1对话框窗口处理函数
2注册窗口类(不使用)
3创建对话框
4对话框的关闭
对话框窗口处理函数(并非真正的对话框窗口处理函数)
INT CALLBACK DialogProc(
HWND hwndDlg, //窗口句柄
UINT uMsg,//消息ID
WPARAM wParam,//消息参数
LPARAM IParam //消息参数
);
返回TRUE - 缺省处理函数不需要处理
返回FALSE - 交给缺省处理函数处理
不需要调用缺省对话框窗口处理函数。

创建对话框
INT DialogBox(
HINSTANCE hInstance,//应用程序实例句柄
LPCTSTR IpTemplate,//对话框资源ID
HWND hWndParent,//对话框父窗口
DLGPROC IpDialogFunc //自定义函数
);
DialogBox是一个阻塞函数,只有当对话框关闭后,才会返回,继续执行后续代码
返回值是通过EndDialog设置
对话框的关闭
BOOL EndDialog(
HWND hDlg,//关闭的对话框窗口句柄
INT_PTR nResult //关闭的返回值
);
关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow等函数
nResult是DialogBox函数退出时的返回值
对话框的消息
WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。
无模式对话框
HWND CreateDialog(
HINSTANCE hInstance,//应用程序实例句柄
LPCTSTR IpTemplate,//模板资源ID
HWND hWndParent, //父窗口
DLGPROC IpDialogFunc //自定义函数
);
非阻塞函数,创建成功返回窗口句柄,需要使用ShowWindow函数显示对话框。
对话框的关闭
关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框。

#include <windows.h>
#include "resource.h"
HINSTANCE g_hInstance = 0;
INT CALLBACK DlgProc(HWND hWndlg, UINT msgID, WPARAM wParam, LPARAM IParam) {

	switch (msgID)
	{
	case WM_INITDIALOG:
		MessageBox(hWndlg, "WM_INITDIALOG", "Infor", MB_OK);
		break;
	case WM_CREATE:
		MessageBox(hWndlg, "WM_CREATE", "Infor", MB_OK);
		break;
	case WM_SYSCOMMAND:
		if (wParam == SC_CLOSE) {
			//销毁模式对话框
			EndDialog(hWndlg, 100);
		}
		break;
	}
	return FALSE;
}


void OnCommand(HWND hWnd, WPARAM wParam) {
	switch (LOWORD(wParam))
	{
	case ID_MODEL:
	{
		int nRet = DialogBox(g_hInstance, (char*)IDD_DIALOG1, hWnd, (DLGPROC)DlgProc);
		if (nRet == 100) {
			MessageBox(hWnd, "successful", "Infor", MB_OK);  
		}
	}
	break;
	default:
		break;
	}
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM IParam)
{
	switch (msgID) {
	case WM_COMMAND:
		OnCommand(hWnd, wParam);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, msgID, wParam, IParam);
}

int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
	g_hInstance = hIns;
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = "Main";
	wc.lpszMenuName = (char*)IDR_MENU1;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc); //将以上所有赋值全部写入操作系统中
	//在内存创建窗口
	HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL
		, hIns
		, NULL);

	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, NULL, 0, 0)) { //抓消息
		TranslateMessage(&nMsg);//翻译消息
		DispatchMessage(&nMsg);//派发消息:将消息交给窗口处理函数来处理。
	}

	return 0;
}
//需要在任务管理器中退出线程!




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Win32 API提供了几种绘制按钮的方法,其中常用的是使用DrawFrameControl和DrawEdge函数。 以下是一个简单的示例代码,演示如何使用Win32 API在窗口中绘制按钮: ```c++ #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 创建窗口 HWND hwnd; WNDCLASSEX wc = { sizeof(WNDCLASSEX) }; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = L"ButtonDemo"; RegisterClassEx(&wc); hwnd = CreateWindowEx(0, L"ButtonDemo", L"Button Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // 绘制按钮外框 RECT rect = { 50, 50, 150, 100 }; DrawFrameControl(hdc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH); // 绘制按钮文本 HFONT hFont = CreateFont(20, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Segoe UI"); HGDIOBJ hOldFont = SelectObject(hdc, hFont); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(0, 0, 0)); rect.left += 10; rect.top += 10; DrawText(hdc, L"Button", -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); SelectObject(hdc, hOldFont); DeleteObject(hFont); EndPaint(hwnd, &ps); break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } ``` 该示例代码在窗口中绘制一个矩形按钮,并在其中添加文本。您可以使用相同的方法绘制其他类型的按钮,例如圆形按钮或图像按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值