windows学习笔记1 窗口

来源:互联网 发布:bt离线下载软件 编辑:程序博客网 时间:2024/06/07 12:24

#include"stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,//本模块的实例句柄

                     HINSTANCE hPrevInstance,

                     LPSTR    lpCmdLine[微软用户1] ,//命令行参数

                     int      nCmdShow[微软用户2] )//主窗口初始化时的显示方式

{// TODO:Place code here.

       ::[微软用户3] MessageBox(NULL,"Hello,Win32Application","04Win32AppDemo",MB_OK);

       return 0;

}

 

取得应用程序的实例句柄:

hInstance=(HINSTANCE)GetMoudleHandle(NULL);

 

 

MessageBox,弹出一个对话框向用户显示短信息:

int MessageBox (

HWND hWnd,//窗口句柄指定了哪个窗口将拥有要创建的对话框

LPCSTR lpText,//将要显示的消息

LPCSTR lpCaption,//对话框的标题

UINT uType);//指定对话框的内容和行为

 

uType:

MB_OK

MB_OKCANCEL                        //确认,取消

MB_ABORTRETRYIGNORE             //终止、重试、忽略

MB_YESNOCANCEL                 //是、否、取消

MB_YESNO

MB_RETRYCANCEL                  //重试、取消

      

MB_ICONEXCLAMATION                一个惊叹号出现在消息框

MB_ICONWARNING                       一个惊叹号出现在消息框

MB_ICONINFORMATION                     一个圆圈中小写字母i组成的图标出现在消息框

MB_ICONASTERISK                         一个圆圈中小写字母i组成的图标出现在消息框

MB_ICONQUESTION                      一个问题标记图标出现在消息框

MB_ICONSTOP                              一个停止消息图标出现在消息框

MB_ICONERROR                           一个停止消息图标出现在消息框

MB_ICONHAND                                    一个停止消息图标出现在消息框

 

MB_DEFBUTTON?                   第?个按钮是选中按钮

 

举例:

Int nSel = :: MessageBox(NULL , ”Hello,Win32” , Appliaction” , ”04Win32AppDemo” ,MB_YESNOCANCEL|MB_ICONQUESTION|MB_DEFBUTTON3);

If(nSel==IDYES){…}

 

 

 

窗口函数(消息处理函数)是一个自定义回调函数:

       LRESULT CALLBACK[微软用户4] WindowProc(HWNDhwnd[微软用户5] ,UNIT uMsg[微软用户6] ,WPARAM wParam,LPARAM lParam);

 

一般应用程序在收到WM_CLOSE消息后会去试图销毁自己的窗口,所以可以通过向窗口发送ID号为WM_CLOSE的消息来关闭它,例如:

 

Int main(int argc,char* argv[])

{

HWND hWnd=::FindWindow[微软用户7] (“Notepad”[微软用户8] ,NULL[微软用户9] );

       If(hWnd!=NULL)

       {

              ::SendMessage(hWnd,WM_CLOSE,0,0);

       }

Return 0;

}

 

SendMessage用于向窗口发送消息,直到目标窗口处理完这个消息才返回

LRESULT SendMessageHWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)

 

 

 

 

 

//最简单的窗口程序

#include"stdafx.h"

LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);

int APIENTRYWinMain(HINSTANCEhInstance,

                HINSTANCEhPrevInstance,

                LPSTR     lpCmdLine,

                int       nCmdShow)

{//------------------------------------------------------WinMain开始

char szClassName[]="MainClass"[微软用户10] ;

WNDCLASSEX[微软用户11]  wndclass;//描述主窗口的参数填充WNDCKASSES结构

wndclass.cbSize=sizeof(wndclass);//结构的大小

wndclass.style[微软用户12] =CS[微软用户13] _HREDRAW|CS_VREDRAW;//如果改变大小就重画

wndclass.lpfnWndProc[微软用户14] =MainWndProc;[微软用户15] //窗口函数指针

wndclass.cbClsExtra=0;            //没有额外的类内存

wndclass.cbWndExtra=0;         //没有额外的窗口内存

wndclass.hInstance[微软用户16] =hInstance;        //实例句柄

wndclass.hIcon=::LoadIcon(NULL,IDI_APPLICATION);      //使用预定义图标

wndclass.hCursor=::LoadCursor(NULL,IDC_ARROW);             //使用预定义光标

wndclass.hbrBackground=[微软用户17] (HBRUSH)::GetStockObject(WHITE_BRUSH[微软用户18] );//使用白色背景画刷

wndclass.lpszMenuName=NULL;                  //不指定菜单

wndclass.lpszClassName=szClassName[微软用户19] ;//窗口类名称

wndclass.hIconSm=NULL;                      //没有类的小图标

       //注册这个窗口类

::RegisterClassEx[微软用户20] ([微软用户21] &wndclass[微软用户22] );

       //创建主窗口

HWND hwnd=::CreateWindowEx[微软用户23] (//----------------------------------------------------

              0,                                       //dwExStyle,扩展样式

              szClassName,                    //lpClassName,类名

              "Myfirst Window!",          //lpWindowName,标题

              WS[微软用户24] _OVERLAPPEDWINDOW[微软用户25] ,//dwStyle,窗口风格

              CW_USEDEFAULT,             //初始化X坐标

              CW_USEDEFAULT,             //初始化Y坐标

              CW_USEDEFAULT,             //nWidth宽度

              CW_USEDEFAULT,             //nHeight,高度

              NULL,                                 //hWndParent,父窗口句柄

              NULL,                                 //hMenu,菜单句柄

              hInstance,                          //hInstance,程序实例句柄

              NULL);                               //lpParam,用户数据-----------------------------

if(hwnd==NULL){

       ::MessageBox(NULL,"创建窗口出错!","error",MB_OK);

       return-1;

       }

       //显示窗口刷新窗口客户区

::ShowWindow(hwnd,nCmdShow[微软用户26] );

::UpdateWindow[微软用户27] (hwnd);

       //从消息队列中取出消息交给窗口函数处理直到GetMessage返回FALSE结束消息循环

MSG msg;

while(::GetMessage(&msg,NULL,0,0)){

              //转化键盘消息

       ::TranslateMessage(&msg);

              //将消息发送到相应的窗口函数

       ::DispatchMessage[微软用户28] (&msg);

       }

       //GetMessage返回FALSE时程序结束

return msg.wParam;

}

//------------------------------------------------------------WinMain结束

//-----------------------------------------------------回调函数[微软用户29] MainWndProc开始

LRESULT CALLBACK MainWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){

charszText[]="最简单的窗口程序!";

switch(message){

case WM_PAINT:{//窗口客户区需要重画

       HDC hdc;

       PAINTSTRUCTps;//使无效客户区变得有效并取得设备环境句柄

       hdc=::BeginPaint(hwnd,&ps);//显示文字

       ::TextOut[微软用户30] (hdc,10,10,szText,strlen(szText));

       ::EndPaint(hwnd,&ps);

       return0;

                              }

case WM_DESTROY://正在销毁窗口

              //向消息队列投递一个WM_QUIT消息促使GetMessage函数返回0,结束消息循环

       ::PostQuitMessage(0);

       return0;

       }

       //将我们不处理的消息交给系统做默认处理

return ::DefWindowProc[微软用户31] (hwnd,message,wParam,lParam);

}//-----------------------------------------------------------MainWndProc结束

 

 

在桌面上显示一个窗口的具体步骤:

1.     注册窗口类(RegisterClassEx)

2.     创建窗口(CreateWindowEx)

3.     在桌面上显示窗口(ShowWindow)

4.     更新窗口客户区(UpdateWindow)

5.     进入无限消息获取和处理循环。首先是获取消息(GetMessage),如果有消息到达,则将消息分派到回调函数处理(DispatchMessage),若果消息是WM_QUIT,则GetMessage函数返回FALSE,整个消息循环结束。消息具体的处理过程是在MainWndProc函数中进行的。

 

Windows Style

WS_BORDER 创建一个有边框的窗口

WS_CAPTION 创建一个有标题栏的窗口

WS_CHILDWINDOW(or WS_CHILD)创建一个子窗口(不能与WS_POPUP一起使用)

WS_CLIPCHILDREN 当在父窗口内绘制时,把子窗口占据的区域剪切在外,即不在该区域内绘图

WS_CLIPSIBLINGS 裁剪相互有关系的子窗口,不在被其它子窗口覆盖的区域内绘图,仅与WS_CHILD一起使用

WS_DISABLED 创建一个初始被禁止的窗口

WS_DLGFRAME 创建一个有双边框但无标题的窗口

WS_HSCROLL 创建一个带水平滚动杠的窗口

WS_VSCROLL 创建一个带垂直滚动杠的窗口

WS_ICONIC 创建一个初始为图标的窗口,仅可以与WS_OVERLAPPEDWINDOWS一起使用

WS_MAXIMIZE 创建一个最大尺寸的窗口

WS_MINIMIZE 创建一个最小尺寸的窗口(即图标)

WS_MAXIMIZEBOX 创建一个带有极大框的窗口

WS_MINIMIZEBOX 创建一个带有极小框的窗口

WS_OVERLAPPED 创建一个重叠式窗口,重叠式窗口带有标题和边框

WS_POPUP 创建一个弹出式窗口,不能与WS_CHILD一起使用

WS_SYSMENU 窗口带有系统选单框,仅用于带标题栏的窗口

WS_THICKFRAME 创建一个边框的窗口,使用户可以直接缩放窗口

WS_VISIBLE 创建一个初始可见的窗口

 

 


 [微软用户1]由CreateProcess的第二个参数传递

 [微软用户2]由CreateProcess传递

 [微软用户3]全局变量

 [微软用户4]CALLBACK宏是_stdcall的意思,说明采用Windows标准方式传递参数

 [微软用户5]hWnd参数标示了消息到达的窗口

 [微软用户6];uMsg参数是一个被命名的常量(消息ID号),指定了所发的消息。当窗口函数收到消息时,它使用消息ID号来决定如何处理这个消息

 [微软用户7]用于查找窗口类名称和窗口标题与指定字符串相匹配的窗口。记事本的窗口类名为Notepad,所以可以将它传递给FindWindow的主窗口,如果找到,返回的是记事本的主窗口句柄,否则返回NULL

 [微软用户8]HWND hWnd

 [微软用户9]LPDWORD lpdwProcessId

 [微软用户10]类名字符串

 [微软用户11]窗口类。

   每一个窗口类必须有一个窗口过程,当 Windows 把属于特定窗口的消息发送给该窗口时,该窗口的窗口类负责处理所有的消息,如键盘消息或鼠标消息。由于窗口过程差不多智能地处理了所有的窗口消息循环,所以您只要在其中加入消息处理过程即可。

一个窗口类可以创建多个窗口。

 [微软用户12]指定窗口类风格,

 [微软用户13]Class style,在WINUER.H中定义了全部可选样式

 [微软用户14]指定了基于此类的窗口的窗口函数,当窗口收到消息时Windows即自动调用这个函数通知应用程序。

 [微软用户15]回调函数

 [微软用户16]把本程序的实例句柄传给hInstance成员(MainWin的参数之一)

 [微软用户17]指定窗口重画客户区时使用的画刷

 [微软用户18]白色画刷对象的句柄

 [微软用户19]类名定义在前面,这是一个地址。以后基于此类的窗口都要引用这个类名。

 [微软用户20]扩展

 [微软用户21]填充完WNDCLASSES结构,注册。若此函数调用失败返回0。

 [微软用户22]注册窗口类的唯一参数:wndclass的地址

 [微软用户23]创建窗口。函数调用成功将返回窗口句柄,失败返回NULL。

 [微软用户24]Windows Style

 [微软用户25]重叠式窗口(标准窗口)

 [微软用户26]系统传给WinMain的参数,取值可以是SW_SHOW,SW_HIDE,SW_MINIMIZE

 [微软用户27]通过这个窗口发送一个WM_PAINT消息更新它的客户区。当窗口显示在屏幕上时,窗口的客户区被在WNDCLASSEX中指定的刷子擦去了,调用此函数将促使客户区重画,以显示其内容。

 [微软用户28]将消息分派到回调函数处理

函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数MainWinProc中处理消息

 [微软用户29]回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

 [微软用户30]输出文字

 [微软用户31]调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。

0 0