我在第四篇文章:一个相当简单的SDK程序中讲到了通过调用MessageBoxAPI函数来弹出一个对话框,那你有没有想过,我们一句简单的代码背后所隐藏的细节是怎么的呢,那时候让你了解这些未免还早了些,不过现在时机到了,通过一些基本的API函数调用来实现一个自己的对话框其实也不是很难,那么 这一篇文章就是这个目的。并顺带介绍一些基本API的应用,由于前面五篇文章的铺垫,我相信你对SDK 的程序的大致结构和相关字符处理都有所了解了,所以在这篇文章中的这些知识点,我就不再多说,以 免有些人觉得我实在太过啰嗦。实在疑惑的,可以参看前面的文章。
首先我先大概的列出我们为完成这个任务所要用到的一些API函数他
SetWindowText 设置窗口的标题
GetClientRect 得到窗口客户区的大小信息
GetWindowLongPtr 通过窗口句柄得到和窗口的相关联信息
CreateWindowEx 创建窗口
BeginPaint 得到窗口的设备句柄
EndPaint 释放窗口的设备句柄
DrawText 通过设备句柄在窗口上画出文字
好了,就这些函数,我们就能自己实现有一个确定按钮并在确定按钮正上方显示提示信息的简易的对 话框了,不过这个对话框可是我们一句一句代码自己实现的哟~~还是比较有成就感吧~
程序的大体框架呢还是我们上一篇文章中的框架,注册窗口类,创建一个主窗口,消息循环,窗口消 息处理函数。不过要我们需要在窗口消息处理函数中添加一些代码来完成我们需要的功能。在什么地方 添加呢? 上个程序,我们只处理WM_DESTROY这个消息。对于这个消息我不再做讲解,不懂的或者忘记 了的可以自己MSDN或者看上一篇文章,这里我们要添加对两个消息的处理代码,首先是WM_CREATE,这个 消息会在一个窗口被创建的时候被发送到窗口消息处理函数,如果一些事情需要在一个窗口刚被创建的 时候执行,那么通过处理WM_CREATE最合适不过啦,代码如下:
case WM_CREATE:
{
RECT rctClient; //用来存放主窗口客户区大小信息
const int buttonWidth = 80; //按钮的宽
const int buttonHeight = 25; /按钮的高
GetClientRect( hwnd, &rctClient ); //得到主窗口客户区的大小信息
HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr( hwnd, GWLP_HINSTANCE );
HWND hButton = CreateWindowEx( 0L, _T("button"), _T("确定"), WS_VISIBLE | WS_CHILD , rctClient.right/2-buttonWidth/2, rctClient.bottom/2- buttonHeight/2, buttonWidth, buttonHeight, hwnd, (HMENU)2, hInst, NULL );
SetWindowText( hwnd, _T("自定义对话框") );
break;
}