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

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

备份用

WIMP 基本编程模型
1.png

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

现代图形用户界面
3.png

学习目的和方法

  • 学会编写图形用户界面的软件。
  • 品味图形界面系统的面向对象模型。
  • 探索面向对象设计精髓。
  • 提升代码量,积累编程经验。

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功能框架
4.png

5.png


visitor tracker
访客追踪插件


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值