拈花小仙 发表于 2014-10-15 16:12:17

不让默认函数处理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;
}

漩涡鸣人 发表于 2014-10-15 16:12:18

是因为SC_MOVE没被默认处理,所以就不允许窗口移动了

风之残月 发表于 2014-10-15 19:36:28

把 return 0; 改为 return DefWindowProc(hWnd, uMsg, wParam, lParam);

qq351317878 发表于 2014-10-16 17:35:58

楼主学c++?{:9_241:}

开始以为是学易语言的 后来以为学Delphi现在觉得是学c++,或许全都都会吧

拈花小仙 发表于 2014-10-16 17:54:51

qq351317878 发表于 2014-10-16 17:35
楼主学c++?

开始以为是学易语言的 后来以为学Delphi现在觉得是学c++,或许全都都会吧

是C呀,不是C++哦~ 易语言和delphi太难啦,C++更难~

qq351317878 发表于 2014-10-16 18:28:54

拈花小仙 发表于 2014-10-16 17:54
是C呀,不是C++哦~ 易语言和delphi太难啦,C++更难~

{:9_220:}居然觉得易语言 和Delphi 难,只能说 你长了个c 逻辑的大脑   

表示佩服{:9_220:}

拈花小仙 发表于 2014-10-16 19:58:35

qq351317878 发表于 2014-10-16 18:28
居然觉得易语言 和Delphi 难,只能说 你长了个c 逻辑的大脑   

表示佩服

本来就是难嘛,我C学的不好,但是用C基础就行呀,易语言是面向对像的,能不难嘛?

qq351317878 发表于 2014-10-16 20:16:11

拈花小仙 发表于 2014-10-16 19:58
本来就是难嘛,我C学的不好,但是用C基础就行呀,易语言是面向对像的,能不难嘛?

{:9_230:}其实我对面对对象和面对过程都不太了解    所以目前还是菜鸟

拈花小仙 发表于 2014-10-16 20:20:26

qq351317878 发表于 2014-10-16 20:16
其实我对面对对象和面对过程都不太了解    所以目前还是菜鸟
你是学什么的呀?

qq351317878 发表于 2014-10-16 20:27:09

拈花小仙 发表于 2014-10-16 20:20
你是学什么的呀?

Delphi    觉得比较简单开发速度快。功能也很强大需要的功能都能满足

拈花小仙 发表于 2014-10-16 20:28:01

qq351317878 发表于 2014-10-16 20:27
Delphi    觉得比较简单开发速度快。功能也很强大需要的功能都能满足

不懂哦,看上去很难

qq351317878 发表于 2014-10-16 20:32:29

拈花小仙 发表于 2014-10-16 20:28
不懂哦,看上去很难

小甲鱼讲得好,很通俗易懂{:9_240:}

拈花小仙 发表于 2014-10-16 20:56:43

qq351317878 发表于 2014-10-16 20:32
小甲鱼讲得好,很通俗易懂

我比较笨,只会C

智商是硬伤 发表于 2015-8-26 08:15:20

{:7_146:}
页: [1]
查看完整版本: 不让默认函数处理WM_SYSCOMMAND消息,为什么就不支持窗口拖拽呢?