不让默认函数处理WM_SYSCOMMAND消息,为什么就不支持窗口拖拽呢?
#include <Windows.h>HINSTANCE g_hInstance;
HWND g_hButton;
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
LPCREATESTRUCT ps = LPCREATESTRUCT(lParam);
//MessageBox(hWnd,ps->lpszName,TEXT(""),MB_OK);
g_hButton = CreateWindowEx(0,TEXT("BUTTON"),TEXT("BUTTON"),WS_CHILD|WS_VISIBLE,
0,0,100,100,hWnd,HMENU(1001),g_hInstance,NULL);
}
void OnSize(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
int nWidth= LOWORD(lParam);
int nHeight = HIWORD(lParam);
int nX = (nWidth - 100)/ 2;
int nY = (nHeight - 100) / 2;
MoveWindow(g_hButton,nX,nY,100,100,TRUE);
}
bool OnSysCommand(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (wParam)
{
case SC_CLOSE:
if (IDOK == MessageBox(NULL, TEXT("是否要退出程序?"), TEXT("提示"), MB_OKCANCEL | MB_ICONWARNING))
{
return true;
}
}
return false;
}
void OnCommand(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (wParam)
{
case 1001:
if (IDOK == MessageBox(NULL, TEXT("是否退出程序"), TEXT("提示"), MB_OKCANCEL | MB_ICONWARNING))
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
break;
}
}
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
OnCreate(hWnd,uMsg,wParam,lParam);
break;
case WM_SIZE:
OnSize(hWnd, uMsg, wParam, lParam);
break;
case WM_SYSCOMMAND:
if (true == OnSysCommand(hWnd, uMsg, wParam, lParam))
{
break;
}
else
{
return 0;
};
//为什么加上这个消息,就不支持窗口拖拽?
//是因为无法处理最大化、最小化窗口,也无法处理拖拽了吗?
case WM_COMMAND:
OnCommand(hWnd,uMsg,wParam,lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
void RegisterWnd(LPCTSTR lpClassName)
{
WNDCLASSEX wce;
wce.style = CS_HREDRAW | CS_VREDRAW;
wce.lpfnWndProc = WndProc;
wce.cbSize = sizeof(WNDCLASSEX);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hInstance = g_hInstance;
wce.hIcon = 0;
wce.hCursor = 0;
wce.hIconSm = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE);
wce.lpszClassName = lpClassName;
wce.lpszMenuName = 0;
if (!RegisterClassEx(&wce))
{
MessageBox(NULL, TEXT("注册失败"), TEXT("提示"), MB_OK);
}
}
HWND CreateWnd(LPCTSTR lpClassName)
{
HWND hWnd = CreateWindowEx(0, lpClassName, L"HELLO",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
return hWnd;
}
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
void Message()
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
g_hInstance = hInstance;
RegisterWnd(L"hello");
HWND hWnd = CreateWnd(L"hello");
DisplayWnd(hWnd);
Message();
return 0;
}
是因为SC_MOVE没被默认处理,所以就不允许窗口移动了 把 return 0; 改为 return DefWindowProc(hWnd, uMsg, wParam, lParam); 楼主学c++?{:9_241:}
开始以为是学易语言的 后来以为学Delphi现在觉得是学c++,或许全都都会吧 qq351317878 发表于 2014-10-16 17:35
楼主学c++?
开始以为是学易语言的 后来以为学Delphi现在觉得是学c++,或许全都都会吧
是C呀,不是C++哦~ 易语言和delphi太难啦,C++更难~ 拈花小仙 发表于 2014-10-16 17:54
是C呀,不是C++哦~ 易语言和delphi太难啦,C++更难~
{:9_220:}居然觉得易语言 和Delphi 难,只能说 你长了个c 逻辑的大脑
表示佩服{:9_220:} qq351317878 发表于 2014-10-16 18:28
居然觉得易语言 和Delphi 难,只能说 你长了个c 逻辑的大脑
表示佩服
本来就是难嘛,我C学的不好,但是用C基础就行呀,易语言是面向对像的,能不难嘛? 拈花小仙 发表于 2014-10-16 19:58
本来就是难嘛,我C学的不好,但是用C基础就行呀,易语言是面向对像的,能不难嘛?
{:9_230:}其实我对面对对象和面对过程都不太了解 所以目前还是菜鸟 qq351317878 发表于 2014-10-16 20:16
其实我对面对对象和面对过程都不太了解 所以目前还是菜鸟
你是学什么的呀? 拈花小仙 发表于 2014-10-16 20:20
你是学什么的呀?
Delphi 觉得比较简单开发速度快。功能也很强大需要的功能都能满足 qq351317878 发表于 2014-10-16 20:27
Delphi 觉得比较简单开发速度快。功能也很强大需要的功能都能满足
不懂哦,看上去很难 拈花小仙 发表于 2014-10-16 20:28
不懂哦,看上去很难
小甲鱼讲得好,很通俗易懂{:9_240:} qq351317878 发表于 2014-10-16 20:32
小甲鱼讲得好,很通俗易懂
我比较笨,只会C {:7_146:}
页:
[1]