抄第4遍时,发现:WndProc声明后,还必须有定义才能不报错
#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;
MSGmsg;
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不起来
} 本帖最后由 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;
MSGmsg;
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)
{
;
} 以上作业,是以逐行F5的过程理解并抄写的,下面,完成窗口过程,同样使用逐行F5,看看有哪些错误出现。 #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;
MSGmsg;
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); //照抄本域的所有参数入实参
} hdc = BeginPaint(hwnd,&ps);
之后,干什么呢?就结否了:
EndPaint(hwnd,&ps); 本帖最后由 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;
MSGmsg;
//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,是出生窗口的大小;
} 总结,通过第3遍抄写,结合以住控制台的学习,手动更改如下:
hdc = BeginPaint(hwnd,&ps);
之后,干什么呢?就结否了:
EndPaint(hwnd,&ps);
得到自定义的无返回函数:dosomething(){}
其参数列表为:
WNDCLASS *wndclass,
HDC hdc,
PAINTSTRUCT *ps,
HWND hwnd,
RECT *rect
其中,
还需要让窗口过程类型的对像wndclass处于全域,才能使用自定义的dosomething函数。
警告 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大项警告... 不必要的注释太多了。。。 注释确实太多了,一定改正,谢谢。
页:
[1]