您的位置:首页 > 其它

Windows程序设计学习笔记一——第一个windows窗口

2017-07-13 10:29 501 查看
初次接触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 ;
}
4000

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) ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: