鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

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

[复制链接]
发表于 2017-6-4 19:08:44 | 显示全部楼层
哇 今天学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 20:57:37 | 显示全部楼层
hyq510 发表于 2016-2-19 22:56
为什么我编译不过示例代码
C:%users\亚龙\Desktop\新建文件夹\collect2.exe        [Error] ld returned 1 exit s ...

这个是Win32项目不是C项目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 20:58:31 | 显示全部楼层
东吴 发表于 2016-10-9 17:10
有一种创建窗口的函数
:
HWND hwand =::CreatWindowEx('''''''')

甲鱼哥不是说过嘛,带Ex的API是加强版的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

因为CPP是C的升级版,所以支持C代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 21:00:42 | 显示全部楼层
刚开始看,对Win32程序还不是很了解,希望看完甲鱼哥的教程后可以把它改成纯C的模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-27 17:51:03 | 显示全部楼层
当一个消息循环结束之后到下一个循环会把客户区之前打印的信息清除掉重新打印新的信息吗为什么(新的信息位置不与之前的信息位置重合)?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-27 18:38:23 | 显示全部楼层
joker.... 发表于 2017-12-27 17:51
当一个消息循环结束之后到下一个循环会把客户区之前打印的信息清除掉重新打印新的信息吗为什么(新的信息位 ...

1.不一定,触发WM_PAINT时会
2.我看不懂,能在Windows板块发个提问帖吧~不然没多少人理你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-30 17:07:39 | 显示全部楼层
joker.... 发表于 2017-12-27 17:51
当一个消息循环结束之后到下一个循环会把客户区之前打印的信息清除掉重新打印新的信息吗为什么(新的信息位 ...

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

使用道具 举报

发表于 2018-11-27 19:19:12 From FishC Mobile | 显示全部楼层
东吴 发表于 2016-10-9 17:10
有一种创建窗口的函数
:
HWND hwand =::CreatWindowEx('''''''')

扩展的窗体,如有子窗体,弹出式,主窗体在其表现出来不同式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 11:57:15 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-1 12:35:06 | 显示全部楼层
为什么我抄那个windows程序设计那本书上的代码,不能运行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 19:57:59 | 显示全部楼层
本帖最后由 howzyao 于 2020-3-28 20:00 编辑

#include <Windows.h>

//*1 现在来定义它
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        PSTR      szCmdLine,
        int       iCmdShow)
{
        //MessageBox(NULL, TEXT("抄5遍再说"), TEXT("5"), MB_OK);
        static TCHAR szAppName[] = TEXT("The New Window");
        HWND hwnd;
        MSG  msg;
        WNDCLASS wndclass;

        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc; //没有函数就无法运行*1
        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("Error on Version"), szAppName, MB_ICONERROR);
                return 0;
        }

        hwnd = CreateWindow(
                szAppName,
                TEXT("1"),
                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;
        //return 0;
}

// *1-1 现在来实现它
LRESULT CALLBACK WndProc( hwnd,  message, wParam, lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;

        switch (message)
        {
        case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps);
                GetClientRect(hwnd, &rect);
                DrawText(hdc, TEXT("这是第1遍"), -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);
}


//已打第一遍,此是第二遍,第一遍竟然白打了,无法通过,提示无法链接,估计是哪里打错了,就重新打,打一行,CTR+F5一次 -_-:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 20:01:41 | 显示全部楼层
本帖最后由 howzyao 于 2020-3-28 20:03 编辑

警告        1        warning C4047: “函数”:“HWND”与“int”的间接级别不同        c:\users\i3\desktop\课堂学习\003输入五遍\win32project1\win32project1\input5s.c        71        1        Win32Project1
通过是通过了,竟然有8个警告
// *1-1 现在来实现它
LRESULT CALLBACK WndProc( hwnd,  message, wParam, lParam)//难道是这里没有写类型的原因?

果然是没有写
HWND xxx0;
UINT  xxx1;
WPARAM xxx2;
LPARAM xxx3;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 20:39:43 | 显示全部楼层
本帖最后由 howzyao 于 2020-3-28 21:03 编辑

打了两遍,头一遍错了;
第二遍通过,但被警告了;
三遍打之前,学到的总结一下:
WIN的主函数必须有四大类型的参数:2个HINSTANCE和一个指向字串的指针和一个整型值变量iCmdShow

静态字串是宽字还是标准字串,取决于winnt.h::ifdef UNICODE,依赖于系统环境。
主函数中要创建窗口,必须要创建HWND的类对像:xxx//实例中为hwnd,这个变量,用以给windows来标识、并能以此标识达到操作自己创建的窗口的目地。
MSG msg;
同理,MSG类的对像msg;此变量,用来存储一定的值。此变量中一共有6个成员数据分别是:hwnd,message,wParam,lParam,time,pt
其中已学习到的是hwnd,其它待学。
有了窗口的编号和消息对像后,需要创建窗口如下:
WNDCLASS xxx; //实例中xxx为wndclass;
WNDCLASS类型有10个成员分别是:style,lpfnWndProc,cbClsExtra,cbWndExtra,hInstance,hIcon,hCursor,hbrBackground,lpszMenuName,lpszClassName;
具体含意还没有学习,但字面上首个就是风格,所以估计是窗口的一系列外观和字串等变量。
果然依次定义这些成员数据,照抄不表。
如果,注册类不成功,//参数正好是上面的自定义对像wndclass按址入参。
调用一个wini版的hellow world,返回0,直接退出所在的域:WinMain
否则必成功,接着做:
hwnd对像被赋值: CreateWindow()返回的一定是hwnd类型的数据,赋值号一定在HWND类中被重载了,或着存在着友元函数重载了,或HWND的实质就是一个int....
它的参数有11个,分别是szAppName, TEXT("xxx"), WS_WIN中的常量...一连5个,再加2个NULL,再一个WinMain主函数的第一个实参hInstance,最后一个也是NULL
执行完毕后,使用函数:ShowWindow();字面为显示窗口,参数有两个hwnd和iCmdShow
显示后,使用函数:UpdateWindow();字面是更新参数只有一个:hwnd
接下来,进入永远的循环:字面为得到消息,而且参数是按址的:
while( GetMessage( &msg, NULL, 0, 0 ) ) {...}
内有传送和分派两字面的函数,且参数都为按址的消息:&msg
TranslateMessage( &msg );
DispatchMessage( &msg );
如果无限循环能结束,最后执行返回0的条件换成了返回消息的成员wParam:
return msg.wParam;
自此,结束一切。

唯一能结束无限循环的因素,只能是按址传入的参数: &msg。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 21:02:55 | 显示全部楼层
最开头声时的函数如下:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
就如星爷的台词一样让我觉得无厘头。
直到主函数中这一行:
wndclass.lpfnWndProc = WndProc; //没有函数就无法运行*1
按CTRL + F5,报错时,才发现不实现“L 结果类返回的 CALLBACK类返回的 函数 WndProc() ”
就无法通过。
下面复习WndProc( )的实现:
先看参数有没有明白的,或有用的:
hwnd,
message,
wParam,
lParam,
貌似只认识第一个参数:用来编号窗口给WINDOWS用。

HDC hdc;//HDC类的对像hdc是什么,暂时没有学,不管。
PAINTSTRUCT ps; // 也没有学,但字面是画 结构 类的对像 ps,干什么用的,暂时没有学。
RECT rect; // 看样子也是矩形对像矩形,估计是窗口什么的,以后再学。

然后做执行一次的分支:
switch(){...}
条件是一个: message
看来message就是一个int,如果不是……它如何使用switch呢?
内有两个分支:
WM_xxxWIN的常量
第一个是WM_PAINT:
字面是WM_画
hdc 被赋值为 开始画,参数是: 本自定义窗口hwnd本域中唯一,和刚刚定义的“画结构”对像ps,而且是按址入参
得到窗户矩形,参数两个: 本窗,矩形按址。
调用函数DrawText(); // 字面是画字,需要参数有5个:
hdc,
TEXT("...."),
-1,
&rect,
一组WINDOWS的常量
使用成对的EndPaint()来结束BeginPaint(),所以参数同样是一样的: hwnd, &ps
为什么要这么结束,估计是为了释放&ps在两个函数:BeginPaint()中和EndPaint()中的临时占用的内存空间,以后再学。

返回0结束switch()和WndProc()

若没有分支可匹配,则直到最后一行:
return DefWindowProc(); 返回这个函数。参数是4个:
本窗, message, wParam,lParam.
作业打五遍,二遍时学习总结结束。谢谢fishc的教学使用入门。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 17:41:41 | 显示全部楼层
支持下楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 10:56:59 | 显示全部楼层
本帖最后由 CaptainBiken 于 2020-5-25 11:04 编辑


有没有大佬帮我看下这是什么情况,我用的是VS2017
4SVPQLQ@G4$`6X7A_7UB.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-1 21:08:21 | 显示全部楼层
hyq510 发表于 2016-2-19 22:56
为什么我编译不过示例代码
C:%users\亚龙\Desktop\新建文件夹\collect2.exe        [Error] ld returned 1 exit s ...

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

使用道具 举报

发表于 2021-5-22 15:57:17 | 显示全部楼层
错误:undefined reference to `__imp_GetStockObject'
解决:编译时加上参数 "-mwindows"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

c语言和c++
相通
不过c++更高级
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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