吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1777|回复: 13
收起左侧

[求助] WIN32编程 一个简单的问题

[复制链接]
又红又专 发表于 2020-3-14 16:56
[Asm] 纯文本查看 复制代码
#include <windows.h>

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		
		/* Upon destruction, tell the main thread to stop */
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		
		/* All other messages (a lot of them) are processed using default procedures */
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG msg; /* A temporary location for all messages */

	/* zero out the struct and set the stuff we want to modify */
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, /* x */
		CW_USEDEFAULT, /* y */
		640, /* width */
		480, /* height */
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	/*
		This is the heart of our program where all input is processed and 
		sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
		this loop will not produce unreasonably high CPU usage
	*/
	while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&msg); /* Translate key codes to chars if present */
		DispatchMessage(&msg); /* Send it to WndProc */
	}
	return msg.wParam;
}

大佬求解
不明白一点 LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)  
参数hwnd这个窗口句柄   不是全局变量那是如何传进到这个回调函数呢?  

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 又红又专 发表于 2020-3-14 17:00
没有老鸟吗....
黄河大鲤鱼 发表于 2020-3-14 17:41
shallies 发表于 2020-3-14 17:46
窗口的class决定了这个窗口调用哪个函数来处理消息。窗口在调用消息处理函数的时候,把自己的窗口句柄hWnd以及消息类型、消息参数传给消息处理函数。就这么简单。
不是没老鸟,是老鸟觉得这个问题太过初级。
女萝岩 发表于 2020-3-14 17:52
你CreateWindow的时候,系统会给你分配这个窗口的HANDLE。系统自己分配的值,自己也知道在哪里读取。有消息产生的时候,是系统先截获这个消息,哦,这个消息是发生在某个窗口上面的,那系统就会从内存中读取出这个窗口的HANDLE,和消息的类型以及鼠标指针的位置等附加信息,然后调用你窗口处理函数,然后流程就到了你这里了,你要处理某个消息就写代码,不想处理就交给
DefWindowProc处理。


实际上你调试一下窗口程序就知道了,是user32.dll中的一个函数会调用你的WndProc。

你Winmain中的hwnd和WndProc中的hwnd虽然名字一样,但是他们是不一样的变量,地址都不一样,只不过值是一样的,不存在全局变量不全局变量的问题。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
又红又专 + 1 + 1 我很赞同!

查看全部评分

nstar1221 发表于 2020-3-14 18:59
回调函数是系统负责调用的,具体过程差不多是这样:
窗口产生消息(消息中包含这个窗口的句柄)后传给相应的线程,线程中有消息队列,GetMessage从消息队列中取出消息,然后通过DispatchMessage将消息句柄传回内核,在内核中,系统根据消息中的窗口句柄找到相应的窗口,然后调用窗口中的回调函数,这时HWND就用上了,然后该怎么处理就怎么处理。
 楼主| 又红又专 发表于 2020-3-14 20:10

就是 MFC的爸爸  易语言的祖宗
 楼主| 又红又专 发表于 2020-3-14 20:12
shallies 发表于 2020-3-14 17:46
窗口的class决定了这个窗口调用哪个函数来处理消息。窗口在调用消息处理函数的时候,把自己的窗口句柄hWnd ...

牛皮奥铁子
黄河大鲤鱼 发表于 2020-3-14 22:58
又红又专 发表于 2020-3-14 20:10
就是 MFC的爸爸  易语言的祖宗

mfc又是什么……
 楼主| 又红又专 发表于 2020-3-15 09:02

win32 就是C++界面编程但是不能拖拽    MFC 类似易语言封装好了 直接拖拽按钮什么的  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 18:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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