文本绘制
文字的绘制
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;
}
//需要在任务管理器中退出线程!