刚刚开始学习Win32编程,遇到了很多困难,最让人头疼的就是各种奇奇怪怪的函数名,宏名,要死人了。由于是初学,绕了很多弯路。
今天为了设置一个按钮的字体,折腾得我。
首先我们需要创建一个按钮。这里要用到 CreateWindow() 函数,让我数数,应该有11个参数。
MSDN上的:
-
HWND WINAPI CreateWindow(
-
_In_opt_ LPCTSTR lpClassName, //窗口类名
-
_In_opt_ LPCTSTR lpWindowName, //窗口名
-
_In_ DWORD dwStyle, //窗口风格
-
_In_ int x, //起点横坐标
-
_In_ int y, //起点纵坐标
-
_In_ int nWidth, //控件宽度
-
_In_ int nHeight, //控件高度
-
_In_opt_ HWND hWndParent, //父窗口句柄
-
_In_opt_ HMENU hMenu, //菜单句柄(随意设置一个正整数,多个窗口不要相同)
-
_In_opt_ HINSTANCE hInstance, //实例句柄
-
_In_opt_ LPVOID lpParam //额外指针,大多数情况不需要,设置为NULL就行
-
);
现在我们就来创建一个按钮:
这里的hwndButton是在swith语句之前定义的静态变量 (static HWND hwndButton;)
-
case WM_CREATE:
-
hwndButton = CreateWindow(
-
TEXT("button"), //窗口类为按钮,所以要写button 或者BUTTON
-
TEXT("OK"),
-
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, //作为子窗口要设置为WS_CHILD,WS_VISIBLE可见,BS_PUSHBOTTUN就是按钮了
-
710,
-
490,
-
60,
-
20,
-
hwnd, //父窗口句柄
-
(HMENU)0, //菜单句柄,随意设置,不要重复,一般从0开始,这个在处理消息的时候会用到。
-
((LPCREATESTRUCT)lParam)->hInstance, //这个待会儿详细讲
-
NULL
-
);
-
return 0;
LPCREATESTRUCT是一个指向结构CREATESTRUCT的指针
具体参数如下:
-
typedef struct tagCREATESTRUCT { // cs
-
LPVOID lpCreateParams;
-
HINSTANCE hInstance; //应用程序的实例句柄
-
HMENU hMenu; //窗口菜单句柄
-
HWND hwndParent; //父窗口句柄
-
int cy; //指定新窗口的高度,以像素为单位
-
int cx; //指定新窗口的宽度,以像素为单位
-
int y; //指定新窗口的左上角x坐标
-
int x; //指定新窗口的左上角y坐标
-
LONG style; //指定新窗口的类型(方式)
-
LPCTSTR lpszName; //指定新窗口的名称
-
LPCTSTR lpszClass; //指定新窗口类的名称
-
DWORD dwExStyle; //指定新窗口扩展风格。
-
} CREATESTRUCT;
我们要用到其中hInstance,也就是实例句柄。将这个控件绑定到当前的主进程实例上。而正好,在创建主窗口时的第一条WM_CREATE消息的wParam字段就是一个指向CREATESTRUCT的指针,但是使用32为整型储存的地址,我们需要将其转换为一个指针,所以在前面加一个强制转换LPCREATESTRUCT,然后 用取成员运算符得到当前进程实例的句柄。即((LPCREATESTRUCT)lParam)->hInstance;
然后。一运行,发现,字体好丑。
我们就需要重新设置一下字体。就在WM_PAINT中设置吧。
首先我们需要在swith之前定义一个HFONT类型的静态变量hFont(HFONT是字体句柄类型)
然后我们要获取当前系统默认的字体(注意要转换句柄类型)
-
hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
然后通过发送SET_FONT消息,就能改变相应空间的字体了:
-
hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
-
SendMessage(hwndButton, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
hwndButton是按钮控件的句柄。WM_SETFONT为设置字体消息,然后把hFont举报转换为WM_SETFONT的wParam字段,lParam字段设置为TRUE意思
是要重绘。具体可上MSDN查SendMessage()、和MAKELPARAM()。 【MAKELPARAM()作用和MAKELONG一样】
在解释一下:
WM_SETFONT消息的WPARAM字段是要设置的字体的句柄,LPARAM说明是否需要重绘。
然后就大功告成了。去试试吧。
阅读(989) | 评论(0) | 转发(0) |