初次接触Windows程序开发的知识,没有花费太多的精力去理解整个过程的实现原理,先着重于功能的实现,这样对我自己而言,增强了学习的兴趣。整个学习将对《Windows程序设计》第5版中所给的源代码进行理解和重现,并添加一些自己的理解与整理。
在对基本功能实现的熟练掌握的基础上,会进一步加强相关原理内容的学习。
第一篇,对应第三章内容 视窗和讯息
学习目标:1、掌握建立一个Windows窗口的基本实现流程
2、了解涉及到的相关函数的功能,学会查找对应函数的说明(Windows API等)
3、可以相对独立的完成代码的编写,并记忆整个流程
学习总结:
一、建立一个Windows窗口的基本实现流程
1、理解入口函数的各个参数意义int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int iCmdShow){}
hinstance:应用程序当前事例的句柄。
hPrelnstance:应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL。
lpCmdLine:指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine。
iCmdShow:指明窗口如何显示。
2、初始化窗口类别属性
实例化WNDCLASS的对象,并将WNDCLASS数据结构中的各个元素分别初始化,每一个都必须要初始化,共有10个。
(当某一个没有被初始化,运行结果可以编译成功,但是不会出现窗口界面,笔者曾经初始化了两次wndclass.lpszMenuName,但是没有初始化
wndclass.lpszClassName,结果不显示窗口,找了好久才发现这个问题,改过来就可以运行了)
3、注释视窗类别RegisterClass(&wnd);
呼叫 RegisterClass 来注册这个视窗类别。该函式只有一个参数,即指向 WNDCLASS 结构的指针
4、建立视窗CreateWindow()
函数原型为HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,
DWORD dwStyle,
int x,int y,int nWidth,int nHeight,
HWND hWndParent,HMENU hMenu,HANDLE hlnstance,LPVOID lpParam);
具体参数请自己查找
5、显示视窗、更新视窗
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
6、讯息回圈
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
通过以上代码,GetMessage()获得消息信号,TranslateMessage()将消息信号 进行一些转换,DispatchMessage()将信息传给Windows,然後,Windows
将该讯息发送给适当的视窗讯息处理程式,让它进行处理。
7、窗口建立完成,返回msg.wParam参数。
二、视窗消息处理函数
1、视窗处理函数原型
LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);
2、声明数据结构数据需要的结构数据和变量
本次 实现在视窗内显示一行文字,需要以下数据结构
HDC hdc ; //装置内容的数据结构
PAINTSTRUCT ps ; //
RECT rect; //矩形数据结构,存储文本框大小
3、对应消息下的消息处理操作
switch(message){
case WM_CREATE
case WM_PAINT:
{
1、呼叫BeginPaint()获得装置内容的代号
2、呼叫GetClientRectangle()获得设置区域的尺寸大小
3、DrawText()显示要输出的内容和格式
4、呼叫EndPaint()结束,与BeginPaint()必须成对出现
}
case WM_DESTROY
}
随着学习内容的深入,处理函数会越来越复杂,是学习的终点和难点,还会有其他信息加入
4、缺省的信息处理
函数原型DefWindowProc(HWND,UINT,WPARAM,LPARAM);确保任何信息都可以被处理,并返回一个值
三、完整代码
/*------------------------------------------------------------
hellowin.cpp文件
------------------------------------------------------------*/
#include <windows.h>
#include "mmsystem.h" //导入声音头文件
#pragma comment(lib,"winmm.lib") //导入声音头文件库
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Hello") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
/*窗口属性配置*/
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
// UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; //播放"hellowin.asv"声音文件
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}