|
楼主 |
发表于 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,是出生窗口的大小;
} |
|