您的位置:首页 > 编程语言 > C语言/C++

C/C++_log2000_空白窗口3及初步gui编程笔记

2017-06-04 20:14 441 查看

纯C实现一个空白窗口entry3 & C语言gui编程之绪论、微软API和编程环境笔记

备份用

WIMP 基本编程模型



现代图形用户界面开发架构



现代图形用户界面



学习目的和方法

学会编写图形用户界面的软件。

品味图形界面系统的面向对象模型。

探索面向对象设计精髓。

提升代码量,积累编程经验。

Win32 Application Programming Interface

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

hInstance  程序可执行模块的句柄(.exe).

hPrevInstance 16位时代遗留,取值NULL

lpCmdLine 命令行参数

nCmdShow 一个将要传递给ShowWindow()的整数,

程序只能在内存中运行,但是内存大小远小于硬盘,所以……内存常常不够用,

解决方法

只把最常用的数据驻留内存,建立动态管理机制。Windows内存管理器经常在内存中来回移动对象。

结果产生了新的问题

Windows程序往往都会运行很久,可能过了一会儿,有的数据就被移走了。

影响:直接用指针变量存储地址是不行的!

Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,这就是句柄。

句柄的维护

Windows内存管理器在移动对象在内存中的位置后,把对象的新地址自动更新到句柄地址来保存。

简单理解

句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象

Win32图形库的源代码:

DECLARE_HANDLE(HINSTANCE);
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name


宏展开

struct HINSTANCE__ { int unused;};typedef struct HINSTANCE__ *HINSTANCE;


句柄的数据类型:一个可看作无类型的指针。

讨论:方便强制转换,但安全性是无法保障的。

LPSTR是
char*
,LPCSTR是
const char*


UINT是
unsigned int


理解:

实际上就是一些字母简写,通过Typedef定义

LP前缀代表
Long Pointer


一个C接在LP后面表示是常量指针

W或T表示UNICODE编码,一种国际化编码

注册窗体类

填写一个WNDCLASSEX结构体的成员并调用RegisterClassEx()

cbSize  结构体的大小.

style  类的式样

lpfnWndProc 指向窗口过程的函数指针

cbClsExtra  配置给这个类的额外內存

cbWndExtra 配置给每个窗口的额外內存

hIcon   当用戶按下Alt+Tab时显示的大图标

hCursor   在窗口上显示的光标

hbrBackground 设置我们窗口背景顏色的背景刷子

lpszMenuName 这个类的窗口所用的菜单资源的名字

lpszClassName 类的名字

hIconSm 在任务栏和窗口的左上角显示的小图标(一般为16*16)

创建窗体

WINUSERAPI HWND WINAPI CreateWindowExW(

WINUSERAPI和WINAPI宏是编译约定,约定如参数压入堆栈的顺序为从右到左,显示地从动态链接库导入函数等。

DWORD dwExStyle, //扩展窗体式样

LPCWSTR lpClassName, //窗体类的名字

LPCWSTR lpWindowName,//窗体标题

DWORD dwStyle,//窗口式样参数

int X,int Y,int nWidth,int nHeight,//窗体大小

HWND hWndParent, //父窗口的句柄

HMENU hMenu, //菜单句柄

HINSTANCE hInstance,//应用程序实例句柄

LPVOID lpParam //窗口额外数据的指针

);

ShowWindow(hwnd, nCmdShow);//显示设置

UpdateWindow(hwnd);//更新窗体

消息循环

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;


过程:

不断循环:取得消息,预处理、发送到窗体的过程

消息处理过程

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)    {
case WM_CLOSE:
DestroyWindow(hwnd);    }
return 0;
}


WM_CLOSE

是在我们按下关闭按钮或按下Alt+F4组合时产生的消息。使窗口销毀。

DestoryWindow()

向要销毀的窗口送出WM_DESTORY消息。

WM_DESTORY

删除窗体和子窗体的消息。

PostQuitMessage()

向消息循环发出WM_QUIT消息。我们永远收不到这个消息,因为它使GetMessage()返回FALSE。

Qt功能框架





visitor tracker

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: