首页 > 系统相关 >Windows,C++编程创建窗口的过程详解

Windows,C++编程创建窗口的过程详解

时间:2022-12-09 21:07:27浏览次数:68  
标签:窗口 定义 Windows 创建 C++ window 详解 wndclass


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

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




标签:窗口,定义,Windows,创建,C++,window,详解,wndclass
From: https://blog.51cto.com/u_15907770/5926492

相关文章

  • BroadcastReceiver应用详解
    今天我们来讲一下Android中BroadcastReceiver的相关知识。(请发邮件到 ​​[email protected]​​  获得最新翻强软件。)BroadcastReceiver也就是“广播接收者”......
  • MyBatis详解(二)
    前言本篇幅是继MyBatis详解(一)的下半部分。 MyBatis执行Sql的流程分析【1】基于前面已经将XML文件进行build解析了并且返回了SqlSessionFactory【1.1】那么分析S......
  • Metal 开发 | 使用 C++ 进行接口调用~~
    文章首发博客:https://glumes.com前两天在群里面看到大佬转发一篇文章:GettingstartedwithMetal-cpp。链接在此:​​https://developer.apple.com/metal/cpp/​​文章大意......
  • Day36:List详解
    List1.1概述List为Collection的子接口,代表的一组任意对象,有序,有下标、元素可以重复。1.2方法方法名说明voidadd(intindex,Objecto)在指定位置添加元素......
  • linux系统访问windows分区不用输密码
    linux和windows双系统用户,用linux的时候访问windows分区是时长发生的事。在ubuntu下,可以安装ntfs-config来实现免输入密码访问windows分区,但是我的archlinux不知道为什么始......
  • C++基础
    1.任何合法的C程序都是C++程序。2.c++是一门面向对象的语言。3.标准的C++由三个重要部分组成:核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。C++标准库,提......
  • Windows下git配置与安装(转载)
    ​Git是Linux的创始人LinusTorvalds在2006年开发的,Linus自嘲说是一个“傻瓜内容跟踪器”。在Windows下使用Git,可以使用Cygwin+Git,也可以使用Msys+Git。Cygwin太庞......
  • ffmpeg库安装及入门指南(Windows篇)- 2022年底钜献
    最近项目需要,使用了ffmpeg做摄像头视频采集和串流。这几天有点时间,打算把相关的一些知识记录分享一下。在撰写本文时,我又在另外一台电脑上把ffmpeg重新安装了一遍,所以......
  • ​​windows上传ipa到开发者中心(app store)的方法
    ​windows上传ipa到开发者中心(appstore)的方法​假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将......
  • okHttp 详解
    1.历史上Http请求库优缺点在讲述OkHttp之前,我们看下没有OkHttp的时代,我们是如何完成http请求的. 在没有OkHttp的日子,我们使用​​HttpURLConnection​​或者​​Htt......