Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81055
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: WINDOWS

2015-05-31 23:23:11



        刚刚开始学习Win32编程,遇到了很多困难,最让人头疼的就是各种奇奇怪怪的函数名,宏名,要死人了。由于是初学,绕了很多弯路。


今天为了设置一个按钮的字体,折腾得我。


首先我们需要创建一个按钮。这里要用到 CreateWindow() 函数,让我数数,应该有11个参数。


MSDN上的:  

  1. HWND WINAPI CreateWindow(
  2.   _In_opt_ LPCTSTR lpClassName, //窗口类名
  3.   _In_opt_ LPCTSTR lpWindowName, //窗口名
  4.   _In_ DWORD dwStyle, //窗口风格
  5.   _In_ int x, //起点横坐标
  6.   _In_ int y, //起点纵坐标
  7.   _In_ int nWidth, //控件宽度
  8.   _In_ int nHeight, //控件高度
  9.   _In_opt_ HWND hWndParent, //父窗口句柄
  10.   _In_opt_ HMENU hMenu, //菜单句柄(随意设置一个正整数,多个窗口不要相同)
  11.   _In_opt_ HINSTANCE hInstance, //实例句柄
  12.   _In_opt_ LPVOID lpParam //额外指针,大多数情况不需要,设置为NULL就行
  13. );

现在我们就来创建一个按钮:

这里的hwndButton是在swith语句之前定义的静态变量 (static HWND hwndButton;)
 
  1. case WM_CREATE:
  2.         hwndButton = CreateWindow(
  3.             TEXT("button"), //窗口类为按钮,所以要写button 或者BUTTON
  4.             TEXT("OK"),
  5.             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, //作为子窗口要设置为WS_CHILD,WS_VISIBLE可见,BS_PUSHBOTTUN就是按钮了
  6.             710,
  7.             490,
  8.             60,
  9.             20,
  10.             hwnd, //父窗口句柄
  11.             (HMENU)0, //菜单句柄,随意设置,不要重复,一般从0开始,这个在处理消息的时候会用到。
  12.             ((LPCREATESTRUCT)lParam)->hInstance, //这个待会儿详细讲
  13.             NULL
  14.             );
  15.         return 0;

LPCREATESTRUCT是一个指向结构CREATESTRUCT的指针
具体参数如下:

  1. typedef struct tagCREATESTRUCT { // cs
  2.   LPVOID lpCreateParams;
  3.   HINSTANCE hInstance; //应用程序的实例句柄
  4.   HMENU hMenu; //窗口菜单句柄
  5.   HWND hwndParent; //父窗口句柄
  6.   int cy; //指定新窗口的高度,以像素为单位
  7.   int cx; //指定新窗口的宽度,以像素为单位
  8.   int y; //指定新窗口的左上角x坐标
  9.   int x; //指定新窗口的左上角y坐标
  10.   LONG style; //指定新窗口的类型(方式)
  11.   LPCTSTR lpszName; //指定新窗口的名称
  12.   LPCTSTR lpszClass; //指定新窗口类的名称
  13.   DWORD dwExStyle; //指定新窗口扩展风格。
  14.  } CREATESTRUCT;
我们要用到其中hInstance,也就是实例句柄。将这个控件绑定到当前的主进程实例上。而正好,在创建主窗口时的第一条WM_CREATE消息的wParam字段就是一个指向CREATESTRUCT的指针,但是使用32为整型储存的地址,我们需要将其转换为一个指针,所以在前面加一个强制转换LPCREATESTRUCT,然后 用取成员运算符得到当前进程实例的句柄。即((LPCREATESTRUCT)lParam)->hInstance;  
然后。一运行,发现,字体好丑。
我们就需要重新设置一下字体。就在WM_PAINT中设置吧。
首先我们需要在swith之前定义一个HFONT类型的静态变量hFont(HFONT是字体句柄类型)

  1. static HFONT hFont;

然后我们要获取当前系统默认的字体(注意要转换句柄类型)

  1. hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

然后通过发送SET_FONT消息,就能改变相应空间的字体了:

  1. hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  2. 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) |
给主人留下些什么吧!~~