鱼C论坛

 找回密码
 立即注册
查看: 1930|回复: 9

[学习笔记] 抄第4遍时,发现:WndProc声明后,还必须有定义才能不报错

[复制链接]
发表于 2020-4-4 09:15:14 | 显示全部楼层 |阅读模式

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

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

x
#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT("003 Writes");

        HWND hwnd;
        MSG  msg;
        WNDCLASS wndclass;

        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc; //声明后,还必须有定义才能不报错

        return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uint, WPARAM wParam, LPARAM lPaRAW)
{
        ;//空的也可以,不实现,就F5不起来
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-4 09:48:25 | 显示全部楼层
本帖最后由 howzyao 于 2020-4-4 09:57 编辑

//记错了,这是抄写的第三遍-.-;
#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
        /*static TCHAR szAppName[] = TEXT("003 Writes");*/

        HWND hwnd;
        MSG  msg;
        WNDCLASS wndclass;

        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc; //声明后,还必须有定义才能不报错
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;//主函数的第一个参数,第1次在主函数中使用
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = TEXT("003 Writes"); //静态字符串变量取消,直接赋给lpsz(长指针以0以尾?以szStr类推)

        if (!RegisterClass(&wndclass))//省略文字提示,注册不成功,直接退出,不开工。
                return 0;

        hwnd = CreateWindow(
                wndclass.lpszClassName, //试试省略一个本域全局静态变量,行不行
                TEXT("FishC the first on the three time"),
                WS_OVERLAPPEDWINDOW,
                100,//CW_USEDEFAULT, 试试,此四大同名变量是否如猜测中的含意
                100,//CW_USEDEFAULT,
                640,//CW_USEDEFAULT,
                480,//CW_USEDEFAULT,
                NULL,
                NULL,
                hInstance, //主函数的第一个参数,第2次在主函数中使,且直接入参到CreatWindows函数中
                NULL);     //注册成功运行此行
       
        ShowWindow(hwnd, iCmdShow); //第一次使用到主函数中第一个定义的对像:hwnd和主函数的第四个参数iCmdShow
        UpdateWindow(hwnd);         //第二次用到到主函数中第一个定义的对像:hwnd

        while (GetMessage(&msg, NULL, 0, 0)) //第一次使用到主函数中的第二个定义的对像:msg,其中复现了
                                                            //MSG *p=&msg;的概念,这里直接使用了地址。
        {
                TranslateMessage(&msg); //第二次使用到主函数中的第二个定义的对像:msg
                DispatchMessage(&msg);  //第三次使用到主函数中的第二个定义的对像:msg
        }

        return msg.wParam; //第四次使用到主函数中的第二个定义的对像:msg;且第一次用到MSG的成员wParam
                           //这个成员同时是WndProc函数的第三个参数,返回这个值,是主函数返回0的不同之处
        //return 0; //此时,已有无法显示和退出的窗口(只能用任务管理器关闭它)
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uint, WPARAM wParam, LPARAM lPaRAW)
{
        ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 09:53:51 | 显示全部楼层
以上作业,是以逐行F5的过程理解并抄写的,下面,完成窗口过程,同样使用逐行F5,看看有哪些错误出现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 10:12:52 | 显示全部楼层
#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
        /*static TCHAR szAppName[] = TEXT("003 Writes");*/

        HWND hwnd;
        MSG  msg;
        WNDCLASS wndclass;

        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc; //声明后,还必须有定义才能不报错
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;//主函数的第一个参数,第1次在主函数中使用
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = TEXT("003 Writes"); //静态字符串变量取消,直接赋给lpsz(长指针以0以尾?以szStr类推)

        if (!RegisterClass(&wndclass))//省略文字提示,注册不成功,直接退出,不开工。
                return 0;

        hwnd = CreateWindow(
                wndclass.lpszClassName, //试试省略一个本域全局静态变量,行不行
                TEXT("FishC the first on the three time"),
                WS_OVERLAPPEDWINDOW,
                100,//CW_USEDEFAULT, 试试,此四大同名变量是否如猜测中的含意
                100,//CW_USEDEFAULT,
                640,//CW_USEDEFAULT,
                480,//CW_USEDEFAULT,
                NULL,
                NULL,
                hInstance, //主函数的第一个参数,第2次在主函数中使,且直接入参到CreatWindows函数中
                NULL);     //注册成功运行此行
       
        ShowWindow(hwnd, iCmdShow); //第一次使用到主函数中第一个定义的对像:hwnd和主函数的第四个参数iCmdShow
        UpdateWindow(hwnd);         //第二次用到到主函数中第一个定义的对像:hwnd

        while (GetMessage(&msg, NULL, 0, 0)) //第一次使用到主函数中的第二个定义的对像:msg,其中有MSG *p=&msg;
        {
                TranslateMessage(&msg); //第二次使用到主函数中的第二个定义的对像:msg
                DispatchMessage(&msg);  //第三次使用到主函数中的第二个定义的对像:msg
        }

        return msg.wParam; //第四次使用到主函数中的第二个定义的对像:msg;且第一次用到MSG的成员wParam
                           //这个成员同时是WndProc函数的第三个参数,返回这个值,是主函数返回0的不同之处
        //return 0; //此时,已有无法显示和退出的窗口(只能用任务管理器关闭它)
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//这是一个陌生的概念...
{
        HDC hdc;//类对像,Hardware Deivces Condition类, 用来定义:显示器,打印机等外设硬件。
        PAINTSTRUCT ps; //类对像,paint struct类,用来定义故名思义,接下面出现的ps看吧...
        RECT rect; //类对像,rectangle的大写缩写,矩形类,用来定义故名思义,接下面出现的rect看吧...

        switch (message)//特此更正,开始写为了第二个参数的类名,现在照抄改回变量名为message
        {
        case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps);//记得FishC教程中的成对使用,先写EndPaint(hwnd,&ps);
                EndPaint(hwnd, &ps);
                return 0;//这里第一次返回0,此0非彼0了,想起了第一课打招呼中WinMain(...)中返回的0了...

        case WM_DESTROY:       //进入此分支?
                PostQuitMessage(0);//执行它?
                return 0;          //需要记得窗口没有hwnd,却存活于内存中...
        }

        return DefWindowProc(hwnd, message, wParam, lParam); //照抄本域的所有参数入实参
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 10:14:02 | 显示全部楼层
hdc = BeginPaint(hwnd,&ps);
之后,干什么呢?就结否了:
EndPaint(hwnd,&ps);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 10:36:13 | 显示全部楼层
本帖最后由 howzyao 于 2020-4-4 10:38 编辑

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
WNDCLASS wndclass;
void dosomething(WNDCLASS*, HDC, PAINTSTRUCT*, HWND, RECT*);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
        /*static TCHAR szAppName[] = TEXT("003 Writes");*/

        HWND hwnd;
        MSG  msg;
        //WNDCLASS wndclass;//为了使用dosomething(...),只有把wndclass的作用域放到全局

        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc; //声明后,还必须有定义才能不报错
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;//主函数的第一个参数,第1次在主函数中使用
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = TEXT("003 Writes"); //静态字符串变量取消,直接赋给lpsz(长指针以0以尾?以szStr类推)

        if (!RegisterClass(&wndclass))//省略文字提示,注册不成功,直接退出,不开工。
                return 0;

        hwnd = CreateWindow(
                wndclass.lpszClassName, //试试省略一个本域全局静态变量,行不行
                TEXT("FishC the first on the three time"),
                WS_OVERLAPPEDWINDOW,
                100,//CW_USEDEFAULT, 试试,此四大同名变量是否如猜测中的含意
                100,//CW_USEDEFAULT,
                640,//CW_USEDEFAULT,
                480,//CW_USEDEFAULT,
                NULL,
                NULL,
                hInstance, //主函数的第一个参数,第2次在主函数中使,且直接入参到CreatWindows函数中
                NULL);     //注册成功运行此行
       
        ShowWindow(hwnd, iCmdShow); //第一次使用到主函数中第一个定义的对像:hwnd和主函数的第四个参数iCmdShow
        UpdateWindow(hwnd);         //第二次用到到主函数中第一个定义的对像:hwnd

        while (GetMessage(&msg, NULL, 0, 0)) //第一次使用到主函数中的第二个定义的对像:msg,其中有MSG *p=&msg;
        {
                TranslateMessage(&msg); //第二次使用到主函数中的第二个定义的对像:msg
                DispatchMessage(&msg);  //第三次使用到主函数中的第二个定义的对像:msg
        }

        return msg.wParam; //第四次使用到主函数中的第二个定义的对像:msg;且第一次用到MSG的成员wParam
                           //这个成员同时是WndProc函数的第三个参数,返回这个值,是主函数返回0的不同之处
        //return 0; //此时,已有无法显示和退出的窗口(只能用任务管理器关闭它)
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//这是一个陌生的概念...
{
        HDC hdc;//类对像,Hardware Deivces Condition类, 用来定义:显示器,打印机等外设硬件。
        PAINTSTRUCT ps; //类对像,paint struct类,用来定义故名思义,接下面出现的ps看吧...
        RECT rect; //类对像,rectangle的大写缩写,矩形类,用来定义故名思义,接下面出现的rect看吧...

        switch (message)//特此更正,开始写为了第二个参数的类名,现在照抄改回变量名为message
        {
        case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps);//记得FishC教程中的成对使用,先写EndPaint(hwnd,&ps);
                dosomething(&wndclass, hdc, &ps, hwnd, &rect);//做点什么呢?依照上文第一次使用了ps的地
//址,和hwnd这个把柄,怕是要画吧...
                EndPaint(hwnd, &ps);
                return 0;//这里第一次返回0,此0非彼0了,想起了第一课打招呼中WinMain(...)中返回的0了...

        case WM_DESTROY:       //进入此分支?
                PostQuitMessage(0);//执行它?
                return 0;          //需要记得窗口没有hwnd,却存活于内存中...
        }

        return DefWindowProc(hwnd, message, wParam, lParam); //照抄本域的所有参数入实参
}
void dosomething(WNDCLASS *wndclass, HDC hdc, PAINTSTRUCT *ps, HWND hwnd, RECT *rect)
{
        GetClientRect(hwnd,&rect); //读取客户矩形?把柄?矩形地址?
        DrawText(hdc, wndclass->lpszClassName, -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); //成功地画出来
//了黑底
        //且四大同名变量,猜测正确:前两个100,是指出生窗口位于屏幕的初始位值,左上角为基点;
        //后面的640 480,是出生窗口的大小;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 10:41:37 | 显示全部楼层
总结,通过第3遍抄写,结合以住控制台的学习,手动更改如下:

hdc = BeginPaint(hwnd,&ps);
之后,干什么呢?就结否了:
EndPaint(hwnd,&ps);

得到自定义的无返回函数:dosomething(){}
其参数列表为:
WNDCLASS *wndclass,
HDC hdc,
PAINTSTRUCT *ps,
HWND hwnd,
RECT *rect
其中,
还需要让窗口过程类型的对像wndclass处于全域,才能使用自定义的dosomething函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 10:42:55 | 显示全部楼层
警告        1        warning C4047: “函数”:“LPRECT”与“RECT **”的间接级别不同        f:\programing\vs2013学习\课堂学习\011输入5遍\win32_drawtext\win32_drawtext\training003.c        77        1        Win32_DrawText

警告        2        warning C4024: “GetClientRect”: 形参和实参 2 的类型不同        f:\programing\vs2013学习\课堂学习\011输入5遍\win32_drawtext\win32_drawtext\training003.c        77        1        Win32_DrawText

警告        3        warning C4047: “函数”:“LPRECT”与“RECT **”的间接级别不同        f:\programing\vs2013学习\课堂学习\011输入5遍\win32_drawtext\win32_drawtext\training003.c        78        1        Win32_DrawText

警告        4        warning C4024: “DrawTextW”: 形参和实参 4 的类型不同        f:\programing\vs2013学习\课堂学习\011输入5遍\win32_drawtext\win32_drawtext\training003.c        78        1        Win32_DrawText

跑是跑起了,但得到了4大项警告...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 13:32:13 | 显示全部楼层
不必要的注释太多了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 06:14:36 From FishC Mobile | 显示全部楼层
注释确实太多了,一定改正,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 10:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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