精华内容
下载资源
问答
  • Windows编程-创建窗口

    千次阅读 2016-08-04 23:10:22
    创建窗口 显示更新窗口 消息循环 编写回调函数——————————帅气的分割线—————————– 下面我们一步一步进行讲解: 1.设计窗口类WNDCLASS我们查看MSDN可以知道窗口类的成员变量有哪些:typedef ...

    窗口创建的基本步骤是:

    1. 设计窗口类
    2. 注册窗口类
    3. 创建窗口
    4. 显示更新窗口
    5. 消息循环
    6. 编写回调函数

      ——————————帅气的分割线—————————–
      下面我们一步一步进行讲解:

    1.设计窗口类WNDCLASS

    我们查看MSDN可以知道窗口类的成员变量有哪些:

    typedef struct _WNDCLASS { 
        UINT       style; 
        WNDPROC    lpfnWndProc; 
        int        cbClsExtra; 
        int        cbWndExtra; 
        HINSTANCE  hInstance; 
        HICON      hIcon; 
        HCURSOR    hCursor; 
        HBRUSH     hbrBackground; 
        LPCTSTR    lpszMenuName; 
        LPCTSTR    lpszClassName; 
    } WNDCLASS, *PWNDCLASS; 

    微软为我们设计好了窗口类,我们只需要按照我们的需求填写其中的值就可以了。

    • 我们先看窗口类的第一个字段UINT style;

    这个字段是指明窗口的类型风格,其值是可选项,以”CS_“开头,查看MSDN可以知道它所有的可选项,在这里我说两个选项:”CS_HREDRAW“、”CS_VREDRAW“,分别是水平重绘和竖直重绘,表示窗口在水平和竖直方向大小发生变化时会发出WM_PAINT消息来进行窗口的重新绘制。

    • 接下来看第二个字段:WNDPROC lpfnWndProc;

    这是窗口的回调函数,这里赋值一个函数的名字(函数指针),这个回调函数的参数有一定的要求,查看MSDN可以知道回调函数的声明如下:

    LRESULT CALLBACK WindowProc(  HWND hwnd,      // handle to window
      UINT uMsg,      // message identifier
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter);

    这里对回调函数进行一个简单的说明,操作系统(OS)可以捕获程序的消息,并将消息放到该进程的消息队列中,但是OS并不会对这个消息进行处理,如果想要对消息处理就需要程序员自己来写消息响应函数。当用户按下键盘的时候,OS会捕获两个消息WM_KETYDOWN、WM_KEYUP消息,通过TranslateMessage函数将键盘按下和弹起的消息转换成一个WM_CHAR消息,并将按下的按键的ASCII码存放到消息结构体MSG的附加参数中,然后使用DespatchMessage函数将这个消息传递到回调函数中,并由回调函数进行处理。

    • int cbClsExtra;
    • int cbWndExtra;

    两个附加参数,给0就行

    • 接下来是字段:HINSTANCE hInstance;

    它表示一个应用程序的实例句柄,至于应用程序的实例,可以理解为是一个进程,一个执行的程序。这个字段的值是直接从WinMain函数给过来的。

    • HICON hIcon;
    • HCURSOR hCursor;
    • HBRUSH hbrBackground;

    这三个字段分别是窗口的图标、光标、背景。如果要设置窗口的图标要使用函数:

    HICON LoadIcon(  
      HINSTANCE hInstance, // handle to application instance
      LPCTSTR lpIconName   // name string or resource identifier
      );

    其中,如果想使用系统自带的图标,第一个参数必须写NULL,第二个参数可以是”IDI_“开头的任意可选项。
    而光标一样,需要使用函数:

    HCURSOR LoadCursor(  
      HINSTANCE hInstance,  // handle to application instance
      LPCTSTR lpCursorName  // name or resource identifier
      );

    但是对于背景来说,需要使用下面这个函数来设置:

    HGDIOBJ GetStockObject(  
       int fnObject   // stock object type
    );

    其中fnObject为可选项,详情可查看MSDN

    • LPCTSTR lpszMenuName;
    • LPCTSTR lpszClassName;

    下面是最后的两个字段,其中第一个是菜单的名字,第二个是窗口类的名字。由于没有菜单,菜单名设置为空,窗口类名要在CreateWindow时使用。
    以上就设计好了窗口类了。

    ——————–我是华丽的分割线————————–

    2. 注册窗口类

    使用一下函数就可以,参数是窗口类对象的指针。
    ATOM RegisterClass( CONST WNDCLASS *lpWndClass // class data);

    3. 创建窗口

    使用CreateWindow函数来创建窗口:

      HWND CreateWindow(  
      LPCTSTR lpClassName,  // registered class name
      LPCTSTR lpWindowName, // window name  
      DWORD dwStyle,        // window style
      int x,                // horizontal position of window
      int y,                // vertical position of window
      int nWidth,           // window width
      int nHeight,          // window height
      HWND hWndParent,      // handle to parent or owner window
      HMENU hMenu,          // menu handle or child identifier
      HINSTANCE hInstance,  // handle to application instance
      LPVOID lpParam        // window-creation data
      );

    其中第一个参数”LPCTSTR lpClassName“就是 刚才在第一步设置窗口类时所起的类名字,第二个参数是该窗口的标题,后面的四个参数是窗口左上角的坐标和宽高,接下来两个参数”hWndParent“、”hMenu“是窗口的父窗口句柄和菜单句柄,由于没有就填NULL,最后一个参数”lpParam“是附加参数填NULL。

    4. 显示更新窗口

    ShowWindow(hWnd, SW_SHOWNORMAL); //正常显示窗口
    UpdateWindow(hWnd); //更新窗口

    5. 消息循环

    OS每次从该进程的消息队列中取出第一条消息,使用函数如下:

    BOOL GetMessage(  
      LPMSG lpMsg,         // message information
      HWND hWnd,           // handle to window
      UINT wMsgFilterMin,  // first message  
      UINT wMsgFilterMax   // last message
      );

    在取消息之前,需要声明一个MSG结构的消息变量,它不需要初始化,直接传入第一个参数,该函数会将取出的消息填入该变量。第二个参数是窗口句柄,表明你要接收那个窗口的消息,如果想接收该进程的所有消息,该参数填写NULL。第三、四个参数是消息过滤的最小最大值,表明你要接受消息的范围,如果接收全部消息,这两个值填0就行。

    这个GetMessage有一个BOOL型的返回值,如果取到的消息是WM_DESTROY消息则返回假,所以我们将这个函数放到while循环中,只要有消息就执行循环体,直到用户关闭窗口时发出WM_DESTROY消息后while循环条件为假退出。

    在循环体中,我们要处理消息,使用以下两个函数:

    TranslateMessage(&msg); //翻译消息
    DispatchMessageA(&msg); //将消息传入窗口的回调函数

    这两个函数上面说到过,这里不进行赘述。

    6. 编写回调函数

    由于在第五步的时候使用DispatchMessage函数将一个消息传入回调函数,则在回调函数中对参数msg进行判断和进一步处理。

    再次特别说明两个消息:”WM_CLOSE“、“WM_DESTROY”
    当用户点击关闭窗口按钮的时候会发出一个WM_CLOSE消息,我们进行窗口的销毁,但是一定要注意此时只是销毁了窗口,程序仍然在后台执行。销毁窗口的函数DestroyWindow又会发出一个WM_DESTROY的消息,在处理这个消息的时候使用PostQuitMessage这才真正的退出程序。

    对于我们没有处理的其他消息,我们不能对其不管,所以我们对其他不感兴趣的消息调用系统默认的回调函数DefWindowProc

    ———————–这是另一条分割线————————
    下面是程序的结果:
    这里写图片描述
    上图为程序运行后的界面

    这里写图片描述
    点击鼠标左键后窗口显示文字

    这里写图片描述
    按下键盘按键后窗口弹出对话框

    这里写图片描述
    点击退出按钮窗口弹出对话框,点击是程序结束

    ———————–帅气的分割线—————————–
    下面就是程序的源代码:

    #include <Windows.h>
    #include <stdio.h>
    
    /*
    * 窗口的回调函数
    */
    LRESULT CALLBACK WindowProc(HWND hwnd,      // handle to window
        UINT uMsg,      // message identifier
        WPARAM wParam,  // first message parameter
        LPARAM lParam)   // second message parameter
    {
        HDC hDC;
        PAINTSTRUCT ps;
        switch (uMsg)
        {
        case WM_PAINT:
            /*
             * 窗口重绘时调用
             * 只有在WM_PAINT消息中才可以使用BeginPaint、EndPaint
             * 其他消息使用GetDC、ReleaseDC
             */
            hDC = BeginPaint(hwnd, &ps);
            TextOut(hDC, 0, 50, "这是在WM_PAINT消息中重绘的文字", strlen("这是在WM_PAINT消息中重绘的文字"));
            EndPaint(hwnd, &ps);
            break;
        case WM_CHAR:
            MessageBox(hwnd, "WM_CHAR消息触发了", "提示", MB_OK);
            break;  
        case WM_LBUTTONDOWN:
            hDC = GetDC(hwnd);
            TextOut(hDC, 0, 70, "这是在WM_LBUTTONDOWN消息中重绘的文字", strlen("这是在WM_LBUTTONDOWN消息中重绘的文字"));
            ReleaseDC(hwnd, hDC);
            break;
        case WM_CLOSE:
            if (IDYES == MessageBox(hwnd, "确定要退出吗?", "提示", MB_YESNO))
            {
                //确定退出,销毁窗口,抛出一个WM_DESTYRY的消息
                DestroyWindow(hwnd); 
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,      // handle to current instance
        HINSTANCE hPrevInstance,  // handle to previous instance
        LPSTR lpCmdLine,          // command line
        int nCmdShow)              // show state
    {
        //第一步、设计窗口类
        WNDCLASS wndclass;
        wndclass.style = CS_HREDRAW | CS_VREDRAW; //设置水平竖直重绘,发送WM_PAINT消息
        wndclass.lpfnWndProc = WindowProc; //指定窗口的回调函数
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0; //两个额外数据
        wndclass.hInstance = hInstance;
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = "myWindowClass";
    
        //第二步、注册窗口类
        RegisterClass(&wndclass);
    
        //第三步、创建窗口
        HWND hWnd = CreateWindow(
            "myWindowClass",    //窗口类的名字
            "my first window",  //窗口标题
            WS_OVERLAPPEDWINDOW,    //样式
            0, 0, 500, 500, //左上角坐标,宽高
            NULL, //父窗口
            NULL, //菜单
            hInstance, //实例
            NULL); //附加参数
    
        //第四部、显示更新窗口
        ShowWindow(hWnd, SW_SHOWNORMAL); //正常显示窗口
        UpdateWindow(hWnd); //更新窗口
    
        //第五步、消息循环
        MSG msg;
        while (GetMessageA(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg); //翻译消息
            DispatchMessageA(&msg); //将消息传入窗口的回调函数
        }
    
        return 0;
    }
    
    
    
    
    展开全文
  • Windows,C++编程创建窗口的过程详解

    万次阅读 2015-07-10 17:31:55
    Windows,C++编程创建窗口的是个步骤详解

    MFC创建窗口一般要经历以下四个操作步骤:

    (1)   定义窗口类

    主要指定窗口类的一些基本且必须指定的特征,窗口类的特征主要是由WNDCLASS结构体来定义的,

    WNDCLASS的定义如下:

    typedef struct _WNDCLASS {

       UINT    style;   

       WNDPROC lpfnWndProc;

       int     cbClsExtra;

       int     cbWndExtra;

       HANDLE  hInstance;

       HICON   hIcon;

       HCURSOR hCursor;

       HBRUSH  hbrBackground;

       LPCTSTR lpszMenuName;

       LPCTSTR lpszClassName;

    } WNDCLASS;


    (2)   注册窗口类

    窗口类经过第一步后,需要调用RegisterClass函数进行注册,注册成功后就可以创建此类型的窗口。函数原型如下:

    ATOM RegisterClass(
      CONST WNDCLASS *lpWndClass   // address of structure with class 
                                   // data
    );

    (3)   创建窗口类实例

    注册完窗口类过后,就可以创建窗口类的实例了,创建窗口类的实例了,函数原型如下:HWND CreateWindow(
      LPCTSTR lpClassName// pointer to registered class name
      LPCTSTR lpWindowName, // pointer to window name
      DWORD dwStyle,        // window style
      int x,                // horizontal position of window
      int y,                // vertical position of window
      int nWidth,           // window width
      int nHeight,          // window height
      HWND hWndParent,      // handle to parent or owner window
      HMENU hMenu,          // handle to menu or child-window identifier  
      HANDLE hInstance,     // handle to application instance
      LPVOID lpParam        // pointer to window-creation data
    );
     

    (4)   显示及更新窗口

    当然创建窗口过后就可以调用ShowWindow()来显示窗口了。

    函数原型如下:

    BOOL ShowWindow(
      HWND hWnd,     // handle to window	处的句柄就是CreateWindow()函数的返回值
      int nCmdShow   // show state of window
    );


    显示窗口后紧接着要调用函数UpdateWindow()来刷新窗口,函数原型如下:

    BOOL UpdateWindow(
      HWND hWnd   // handle of window ,此处的句柄就是CreateWindow()函数的返回值
     
    );

    到此时窗口就算创建成功了。

     

    下面我用一个具体的程序来举个例子,方便大家理解: 

    #include<windows.h>    //包含windows.h头文件

    LRESULT CALLBACK WindowProc( HWND , UINT ,WPARAM , LPARAM ); //声明窗口函数

     

    int APIENTRY WinMain(HINSTANCE hinstance ,HINSTANCE hPrevinstance , LPSTR lpcmdLine , int nCmdShow)     //MFC下的程序入口函数WinMain(),传统的dos程序是以main()作为程序入口的,这一点不同

    {

                      WNDCLASSwndclass;    //定义窗口类结构体变量

                      HWNDhwnd;  //定义窗口类句柄

                      MSGmsg;        //定义消息结构体变量

     

                      wndclass.style=CS_HREDRAW|| CS_VREDRAW; //改变窗口大小则重绘

                      wndclass.lpfnWndProc=WindowProc;  //窗口函数为WindowProc()

                      wndclass.cbClsExtra=0; //窗口类无扩展

                      wndclass.cbWndExtra=0;       //窗口实例无扩展

                      wndclass.hInstance=hinstance;     //注册窗口类实例句柄

                      wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);          //使用光标箭头

                      wndclass.hCursor=LoadCursor(NULL, IDC_HELP);      //指定鼠标箭头的样式

                      wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);               //窗口背景为黑色

                      wndclass.lpszMenuName=NULL;           //窗口默认无菜单

                      wndclass.lpszClassName="Windows窗口创建";         //窗口类名为"Windows窗口创建"

     

                      if(!RegisterClass(&wndclass))         //此为注册类的函数

                              {

                                       returnfalse;    //注册不成功,返回false

                              }

     

                      //创建窗口的函数

                      hwnd=CreateWindow("Windows窗口创建" ,     //窗口类名为"Windows窗口创建"

                              "Windows窗口创建",   //窗口的名称为“Windows窗口创建”,即窗口标题栏显示的窗口名称

                              WS_OVERLAPPEDWINDOW, //重叠式窗口

                              CW_USEDEFAULT,CW_USEDEFAULT,    //窗口左上角在屏幕上的默认位置

                              CW_USEDEFAULT,CW_USEDEFAULT,    //窗口的宽度和高度

                              NULL,      //窗口无父类窗口

                              NULL,      //窗口无主菜单

                              hinstance,        //创建此窗口的实例句柄

                              NULL        //此窗口无创建参数

                      );

             ShowWindow(hwnd,nCmdShow); //显示窗口

             UpdateWindow(hwnd);          //不断的更新窗口的客户区

     

             while(GetMessage(&msg,NULL,0,0))    //捕获消息

             {

                      TranslateMessage(&msg);              //键盘消息转换

                      DispatchMessage(&msg);               //派送消息给窗口函数

             }

             returnmsg.wParam;       //返回退出值

    }

     

    LRESULT CALLBACK WindowProc(HWND hwnd,UINTmessage,WPARAM wParam,LPARAM lParam)               //窗口函数

    {

             switch(message)

             {

                      caseWM_PAINT:             //重画窗口客户区消息处理

                              HDChdc; //定义设备句柄

                              PAINTSTRUCTps;            //定义绘图结构体变量

                              hdc=BeginPaint(hwnd,&ps);  //获取要重画的窗口的设备描述表句柄

                              TextOut(hdc,15,20,"Windows窗口创建的过程!",22);                //输出到窗口的文本

                              EndPaint(hwnd,&ps);               //结束重画

                              return0;

                      caseWM_DESTROY:               //撤销窗口消息处理

                              PostQuitMessage(0);               //产生退出程序消息WM_QUIT

                              return0; 

             }

             returnDefWindowProc(hwnd,message,wParam,lParam);

    }

     总结以下,MFC创建窗口的四个步骤

    (1)定义窗口类

    (2)注册窗口类

    (3)创建窗口类的实例

    (4)显示以及更新窗口

    其实这四个步骤很好理解的,打个比方吧。不合适的话还请指教:

    (A.)比如我们新生入学,肯定要按照学校的录取通知书要求填写档案,这就好比定义窗口类,MFC是属于微软的一个基础类,当然我们得准守微软的规则来定义窗口类,而录取通知书是学校发的,我们也得按照学校制定的格式填写录取通知书。

    (B)填写录取通知书过后我们要将通知书拿到学校去注册个人信息,这就好比我们定义了窗口类,然后要在程序中去注册窗口类。

    (C)在学校注册了个人档案后,我们就属于学校的学生了,就属于学校学生的类一个实例了,这就好比我们用注册的窗口类创建了一个窗口实例。

    (D)在学校期间,我们的身体状况是不断变化的,所以学校会定期给学生体检,然后存入学校的档案。这就好比窗口的不断更新,我们不断的对窗口进行操作,而窗口要接收这些消息,就要不断的更新窗口。

    不知道这个比方合不合适,由于本人水平所限,如有不妥还请指正,我怕误导了读者。


    下面是程序中所用到的窗口类实例的资源下载链接:

    MFC创建窗口实例 - 下载频道 - CSDN.NET
    http://download.csdn.net/detail/rl529014/8888867

    展开全文
  • 本笔记源自windows游戏编程大师技巧第二版2.8...该函数是创建Windows类的函数,把我们上一篇WNDCLASSEX类实例化,使用到创建窗口中去。 首先看一下CreateWindowEx()函数原型: HWND CreateWindowEx( DWORD DdwExS...

    本笔记源自windows游戏编程大师技巧第二版2.8章,记做学习随笔。

    使用vs2017环境编译。

    要创建一个窗口,需要使用CreateWindowEx()函数。

    该函数是创建Windows类的函数,把我们上一篇WNDCLASSEX类实例化,使用到创建窗口中去。

    首先看一下CreateWindowEx()函数原型:

    HWND CreateWindowEx(
    DWORD DdwExStyle,        //窗口的扩展风格
    LPCTSTR lpClassName,    //指向注册类名的指针
    LPCTSTR lpWindowName,   //指向窗口名称的指针
    DWORD dwStyle,          //窗口风格
    int x,                  //窗口的水平位置
    int y,                  //窗口的垂直位置
    int nWidth,             //窗口的宽度
    int nHeight,            //窗口的高度
    HWND hWndParent,        //父窗口的句柄
    HMENU hMenu,            //菜单的句柄或是子窗口的标识符
    HINSTANCE hInstance,    //应用程序实例的句柄
    LPVOID lpParam          //指向窗口的创建数据
    );

    该函数创建成功的话,返回一个指向新建窗口的句柄,也就是HWND。

    来详细解释一下:

    dwExStyle——设置一些属性,一般为NULL

    lpClassName——设置之前的创建基础类名,例如“MYNCLASS1”。就是上篇winclass.lpszClassName设置的值。

     lpWindowName——窗口的名称。

    dwstyle——这是一个说明窗口外观的通用标志,见下表。任意组合得到你想要的各种特征。

    x,y——设置窗口右上角的位置。

    nWidth,nHeigth——设置窗口宽高。

    hWndParent——如果有父窗口填父窗口的句柄,没有就取NULL。

    hMenu——指向附属窗口的句柄,下一篇介绍,现在取NULL。

    hInstance——这是应用程序的实例。这里使用WinMain()中第一个实参,hinstance句柄。

    lpparame——设为NULL即可,平时用不到。

     

    #include <Windows.h>
    #include <windowsx.h>
    
    #define WIN32_LEAN_AND_MEAN
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline,int ncmdshow)
    {
    
    	WNDCLASSEX winclass;
    	winclass.cbSize = sizeof(WNDCLASSEX);
    	winclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;
    	winclass.lpfnWndProc = WndProc;
    	winclass.cbClsExtra = 0;
    	winclass.cbWndExtra = 0;
    	winclass.hInstance = hinstance;
    	winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    	winclass.lpszMenuName = NULL;
    	winclass.lpszClassName = "WINCLASS1";
    	winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    
    	//新加入的代码
    	HWND hwnd;
    	if (!(hwnd = CreateWindowEx(NULL,
    		"WINCLASS1",	//winclass.lpszClassName设置的字符,是类的别名。
    		"YouWindows",	//窗口的名称
    		WS_OVERLAPPEDWINDOW | WS_VISIBLE,	//一些窗口属性
    		0, 0,			//窗口位置
    		400, 400,		//窗口宽高
    		NULL,			//父窗口句柄
    		NULL,			//附属窗口句柄
    		hinstance,		//WinMain第一个实参,程序句柄。
    		NULL			//null就可以了
    			)))
    	return 0; //if判断一下hwnd是否为空。
    }

    这就是我们目前的代码,但是他还不能运行,我们仍没有写WndProc()的定义。

    展开全文
  • C++Windows编程创建窗口

    千次阅读 2014-12-24 19:56:14
    Windows编程之注册窗口类介绍了注册窗口类。接下来就是创建窗体。  我们用Visual Studio创建一个win32项目上会自动生成一个创建窗体函数。如下: [cpp] view plaincopy // 函数: ...
    Windows编程之注册窗口类介绍了注册窗口类。接下来就是创建窗体。
        我们用Visual Studio创建一个win32项目上会自动生成一个创建窗体函数。如下:
    1. <  
    2. //   函数: InitInstance(HINSTANCE, int)  
    3. //  
    4. //   目的: 保存实例句柄并创建主窗口  
    5. //  
    6. //   注释:  
    7. //  
    8. //        在此函数中,我们在全局变量中保存实例句柄并  
    9. //        创建和显示主程序窗口。  
    10. //  
    11. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)  
    12. {  
    13.    HWND hWnd;  
    14.   
    15.    hInst = hInstance; // 将实例句柄存储在全局变量中  
    16.   
    17.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,  
    18.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);  
    19.   
    20.    if (!hWnd)  
    21.    {  
    22.       return FALSE;  
    23.    }  
    24.   
    25.    ShowWindow(hWnd, nCmdShow);  
    26.    UpdateWindow(hWnd);  
    27.   
    28.    return TRUE;  
    29. }  
    下面一句一句解释:
    HWND hWnd;
          h 是类型描述,表示句柄, Wnd 是变量对象描述,表示窗口,所以hWnd 表示窗口句柄。通俗地说,如果把一个到处跑的人当作指针的话,那么HWND就是该人的身份证----我想应该是身份证号码
     
    hInst是项目自动生成的一个全局变量,代码如下: HINSTANCE hInst; // 当前实例所以这句话的意识就是将实例句柄存储在全局变量中。
    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
     CreateWindow函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。若要使用除CreateWindow函数支持的风格外的扩展风格,则使用CreateWindowEx函数代替CreateWindow函数。函数原型为:
    1.  HWND CreateWindow(  
    2. LPCTSTR lpClassName,  
    3. LPCTSTR lpWindowName,  
    4. DWORD dwStyle,  
    5. int x,  
    6. int y,  
    7. int nWidth,  
    8. int nHeight,  
    9. HWND hWndParent,  
    10. HMENU hMenu,  
    11. HANDLE hlnstance,  
    12. LPVOID lpParam);  
    lpClassName指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。
    lpWindowName指向一个指定窗口名的空结束的字符串指针。如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。
    dwExstyle指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格意义如下表:
    (表中风格宏都应为大写,为方便阅读,我使用小写,写程序是须使用大写)
    风   格    宏 解    释
    WS_border 单线边框
    WS_caption 有标题框的窗口(包括WS_BODER风格)
    WS_popup 作为一个弹出式窗口
    WS_child 作为子窗体(与WS_popup互斥)
    WS_disabled 窗口不能初始化,并且屏蔽与用户的交互
    WS_dlgframe 窗口的外观类似与对话框
    WS_group 作为窗体的控件,可以与其他控件组合
    WS_hscroll 窗口具有水平滚动条
    WS_vscroll 窗口具有垂直滚动条
    WS_maximize 初始状态为最大化的窗口
    WS_maximizebox 窗口右上角有一个最大化按钮
    WS_minimize 初始状态为最小化的窗口
    WS_minimizebox 窗口右上角有一个最小化按钮
    WS_overlappedwindow 这是一个宏组合。为了方便书写,它等价于WS_overlapped|WS_caption|WS_sysmenu|WS_thickframe|WS_minimizebox|WS_maximizebox
    WS_overlapped 边框重叠的窗口
    WS_sizebox 窗口的边框可以变化
    WS_sysmenu 在窗口的标题栏的最左上角有一个窗口菜单
    WS_tabstop 窗口作为控件,并且交互可以停留在这个控件上
    WS_visible 窗口建立的初始状态是可见的
    x,y,nWidth,nHeight制定了窗口的位置和大小,x和y指定初始左定点坐标,nWidth和nHeight指定宽度和高度。hWndParent指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的。hMenu菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。hInstance在早期的操作系统中,如Windows 95/98/Me,该参数指定与窗口相关的模块实例的句柄,而在较新的操作系统中,如Windows NT/2000/XP/7,可以不理睬该参数。lpPraram指向一个值的指针,该值传递给窗口 WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
    if (!hWnd) 
       {     
             return FALSE;  
      }

    如果创建窗口句柄失败,则返回错误
    ShowWindow(hWnd, nCmdShow);
    显示窗体,ShowWindow函数的原型为BOOL ShowWindow(HWND hWnd,int nCmdShow);第一个参数指定要显示窗口的句柄,第二个参数指定窗口的显示方式,如果加载应用程序提供了STARTUPINFO结构,则应用第一次调用ShowWindow函数时不理财该参数;否则,应用第一次调用ShowWindow函数时从WinMain函数的nCmdShow参数中获取实际值。在后续的函数调用中,nCmdShow的值可以说下表中的任意一个。(表中显示宏都应为大写,为方便阅读,我使用小写,写程序是须使用大写)
    显   示    宏 结    果
    SW_forceminimize 在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数
    SW_hide 隐藏窗口并激活其他窗口
    SW_mazimize 最大化指定的窗口
    SW_minimize 最小化指定的窗口。
    SW_restore 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志
    SW_show 在窗口原来的位置以原来的尺寸激活和显示窗口
    SW_showdefault 依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。
    SW_showmaximized 激活窗口并将其最大化
    SW_showminimized 激活窗口并将其最小化
    SW_showminnoactive 窗口最小化,并不激活窗口,但激活窗口仍然维持激活状态
    SW_showna 以窗口原来的状态显示窗口,激活窗口仍然维持激活状态
    SW_shownoactivate 以窗口最近一次的大小和状态显示窗口,激活窗口仍然维持激活状态
    SW_shownormal 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志
    UpdateWindow(hWnd);
    如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗口的客户区。函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。
    展开全文
  • Windows编程系列——第三讲:创建窗口 这里介绍的是典型的win32窗口应用程序结构,通常需要以下7个步骤: 程序入口点(WinMain函数) 注册窗口类(RegisterClass/EX) 创建窗口类(CreateWindow/ex) 显示主窗口...
  • windows编程学习笔记(1)
  • Windows编程系列——第二讲:基本概念 窗口 上一节我们创建了一个Windows桌面应用程序。这个程序可以直接编译运行,运行后如图: 这就是Windows最基本的元素——窗口。下面介绍它的基本元素: 首先,窗口最外侧...
  • Windows API 编程创建一个windows窗口

    千次阅读 2016-10-08 21:04:06
    windows API函数 创建一个windows窗口
  • windows编程窗口与消息)

    千次阅读 2011-07-26 11:09:36
    窗口是屏幕上的矩形区域,消息窗口功能有限,因为我们不能添加四个以上的按钮以及菜单等,而且添加的按钮必须是windows提供的按钮...自己的窗口创建窗口最重要的函数是CreateWindow,它可以创建重叠式窗口,弹出式窗口
  • Windows运行机理这系列文章都是来至于《零基础学Qt4编程》——吴迪,个人觉得写得很好,所以进行了搬运和个人加工Windows 窗口在...窗口类仅仅定义了窗口的特征,所有创建窗口的对象都用窗口类来创建窗口。程序必须...
  • Windows编程入门-创建第一个Window窗口

    千次阅读 2017-01-26 17:50:28
    从头创建windows窗口程序: 1、创建窗口类; 2、注册窗口类; 3、创建窗口; 4、显示窗口; 5、刷新窗口; 6、消息循环 6.1、获取消息 6.2、翻译消息 6.3、分发消息 7、消息处理函数处理消息.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,259
精华内容 42,103
关键字:

windows编程创建窗口