win32 API写的窗口,不能用鼠标拖动边框改变大小,WS_THICKFRAME已设

freeman_madcat 2014-04-20 11:18:06
vs2013建了个空的win 32 项目。手工写窗口。
出来的窗口不能用鼠标拖动边或角的方式改变窗体大小。鼠标移动到菜单(不是最左上角那个带图标的小菜单)上,菜单也没有任何效果。
在边界处鼠标更本不会变成“双箭头”图标,菜单也不能点。但键盘快捷键来操作菜单是可以的。

另外又建了一个win32 项目,系统自动生成好了窗口代码。用来与手写的做对比。找不出来差别了。

手写的工程中,CreateWindow第三个入参(窗体类的style)是启用了WS_THICKFRAME的。




...全文
459 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Coder_Y_Jao 2014-04-22
  • 打赏
  • 举报
回复
LRESULT返回值不要用0/1 TRUE、FALSE这样的,用S_OK/S_FALSE吧
lpcads 2014-04-21
  • 打赏
  • 举报
回复
引用 4 楼 lpcads 的回复:
一般这么写

LRESULT CALLBACK WndProc( HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
	switch (uMsg)
	{

	case XXX:
		return 0;
	case YYY:
		return 0;
	}

	DefWindowProc(hWnd, uMsg, wParam, lParam);
}
DefWindowProc(hWnd, uMsg, wParam, lParam); => return DefWindowProc(hWnd, uMsg, wParam, lParam);
lpcads 2014-04-21
  • 打赏
  • 举报
回复
引用 3 楼 amaverick 的回复:
修改正确后的如下:
LRESULT CALLBACK MainWndProc( HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
	switch (uMsg)
	{
	case ...:
             ...
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
一般这么写

LRESULT CALLBACK WndProc( HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
	switch (uMsg)
	{

	case XXX:
		return 0;
	case YYY:
		return 0;
	}

	DefWindowProc(hWnd, uMsg, wParam, lParam);
}
freeman_madcat 2014-04-21
  • 打赏
  • 举报
回复
经过我仔细分辨终于看出了端倪。真是大快人心。 WinProc 这个回调函数的返回值错了,导致没有正常返回 DefWindowProc 本应返回给系统的值。系统也许正需要这个返回值来决定是否生成 frame 边框。 看来DefWindowProc干了很多事情啊。在窗口出现在屏幕前,还有很多消息事件可以被程序员的WinProc 接管。 下面是错误的代码:
LRESULT CALLBACK MainWndProc( HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
	switch (uMsg)
	{
	case ...:
             ...
	default:
		DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return TRUE;
}
修改正确后的如下:
LRESULT CALLBACK MainWndProc( HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
	switch (uMsg)
	{
	case ...:
             ...
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
xiaohuh421 2014-04-21
  • 打赏
  • 举报
回复
有sizebox属性吗?
freeman_madcat 2014-04-21
  • 打赏
  • 举报
回复
你是说 WS_SIZEBOX吗? 在 winuser.h 中定义了 WS_SIZEBOX和WS_THICKFRAME 是一回事。 所以我的CreateWindow是定义了的。
#define WS_SIZEBOX          WS_THICKFRAME

65,170

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧