鱼C论坛

 找回密码
 立即注册
查看: 29487|回复: 43

[知识点备忘] 第003讲:窗口!窗口!

[复制链接]
发表于 2014-5-18 20:13:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
知识点回顾:


1. Windows 编程,处处都是窗口编程。

消息框是一个窗口,VS2013也是一个窗口,浏览器也是一个窗口,甚至我们的桌面也是一个窗口程序,还有一些看起来不明显的,例如各种按钮、单选按钮、复选按钮、列表框、滚动条这些其实也都是窗口。


2. 我们很长一段时间是在以下这段代码的基础上进行编程,因此请确保至少自己动手敲 5 次以上:
/* -------------------------------------------------------------------
                    MyWindows.c -- 基本窗口模型  
                                《Windows 程序设计(SDK)》视频教程                    
--------------------------------------------------------------------*/

#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT("MyWindows");
        HWND hwnd;
        MSG msg;
        WNDCLASS wndclass;

        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = szAppName;

        if (!RegisterClass(&wndclass))
        {
                MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
                return 0;
        }

        hwnd = CreateWindow(szAppName, 
                TEXT("鱼C工作室"), 
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, 
                CW_USEDEFAULT, 
                CW_USEDEFAULT, 
                CW_USEDEFAULT,
                NULL, 
                NULL, 
                hInstance, 
                NULL);
        
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);

        while (GetMessage(&msg, NULL, 0, 0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;

        switch (message)
        {
        case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps);
                GetClientRect(hwnd, &rect);
                DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                EndPaint(hwnd, &ps);
                return 0;

        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }

        return DefWindowProc(hwnd, message, wParam, lParam);
}

3. Windows 窗口的诞生过程。

定义窗口类结构(WNDCLASS) -> 注册窗口类(RegisterClass) -> 创建窗口(CreateWindow) -> 显示窗口(ShowWindow) -> 更新窗口(UpdateWindow) -> 消息循环(GetMessage -> TranslateMessage ->DispatchMessage



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-19 12:16:40 | 显示全部楼层
怒顶,@牡丹花下的女鬼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2014-5-21 18:25:49 | 显示全部楼层
是不是还有一个“催毁窗口”的函数操作?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2014-6-2 17:14:02 | 显示全部楼层
好好学习,呵呵!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 1

使用道具 举报

发表于 2014-6-8 18:24:33 | 显示全部楼层
小甲鱼老师,代码的第17行应该是  wndclass.style = CS_HREDRAW | CS_VREDRAW; 吧。不然的话当改变窗口宽度的时候,窗口不会重绘啊

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
小甲鱼 + 5 + 5 + 3 谢谢,代码从视频演示版里拷贝出来,忘记改.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-8-8 17:37:44 | 显示全部楼层

:titter:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-20 23:07:03 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-1 16:00:44 | 显示全部楼层
学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-6 22:13:31 | 显示全部楼层
求问小甲鱼  这段代码是不是只要会用就行了,不需要理解,只要调用API就行了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-3 11:23:05 | 显示全部楼层
好好学习 天天向上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-3 15:25:59 | 显示全部楼层
好好学习下:victory:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-19 22:56:52 | 显示全部楼层
为什么我编译不过示例代码
C:\Users\亚龙\Desktop\新建文件夹\collect2.exe        [Error] ld returned 1 exit status
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-20 13:36:34 | 显示全部楼层
真的很不错,就是我用vs2015的时候代码明明一样,还是有问题,不知道怎么回事 哎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-9 17:10:48 | 显示全部楼层
有一种创建窗口的函数
:
HWND hwand =::CreatWindowEx('''''''')
这个和CreatWindow有何区别呢
感觉参数有些出入啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-9 17:21:54 | 显示全部楼层
我发现一个问题:如果你的项目文件拓展名写的是.cpp
而不是.c
也能运行,这是为什么?
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-15 18:47:52 | 显示全部楼层
东吴 发表于 2016-10-9 17:21
我发现一个问题:如果你的项目文件拓展名写的是.cpp
而不是.c
也能运行,这是为什么?

cpp是c++的后缀,而C++是兼容C的,所以是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-22 13:17:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-6 13:53:56 | 显示全部楼层
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                                   PSTR szCmdLine,int iCmdShow),最后这个参数不对吧,int后应该是要对应ncmdshow的那些值里的某个吧,而且你上面这个参数定义的也是不对,不是i是n吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-25 19:31:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-12 21:59:18 | 显示全部楼层
写的太赞了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 23:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表