IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    WM_COMMAND(BN_CLICKED)实现

    天下发表于 2016-01-20 03:23:00
    love 0
    #include "stdafx.h"
    // TestControl.c 
    //转自http://www.cnblogs.com/memset/archive/2013/05/16/3081082.html ,稍加修改

    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
    #include <atlbase.h>
    #include <atlstr.h>

    #include <WindowsX.h>

    LRESULT CALLBACK ControlWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

    void RegisterControlClass(HINSTANCE hInstance)
    {
        WNDCLASSEXW wce={0};

        wce.cbSize = sizeof(wce);
        wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wce.hInstance = hInstance;
        wce.lpfnWndProc = ControlWindowProc;
        wce.lpszClassName = L"ControlClass";
        wce.style = CS_HREDRAW|CS_VREDRAW;

        RegisterClassExW(&wce);

    }



    LRESULT CALLBACK ControlWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        static HBRUSH hbrBlack,hbrRed;
        switch(uMsg)
        {
        case WM_CREATE:
            {
                hbrBlack = CreateSolidBrush(#000000);
                hbrRed = CreateSolidBrush(#ff0000);

                return 0;
            }
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc;
                hdc = BeginPaint(hWnd,&ps);
                SelectObject(hdc,hbrBlack);
                Rectangle(hdc,0,0,100,50);

                {
                    CString text;
                    ::GetWindowText(hWnd,text.GetBuffer(100),100);
                    text.ReleaseBuffer();
                    TextOutW(hdc,10,10,text,text.GetLength());
                }

                EndPaint(hWnd,&ps);
                return 0;

            }
        case WM_LBUTTONDOWN:
            {
                HDC hdc;
                hdc = GetDC(hWnd);
                SelectObject(hdc,hbrRed);
                Rectangle(hdc,0,0,100,50);
                SetTextColor(hdc,#ff0000);
                {
                    CString text;
                    ::GetWindowText(hWnd,text.GetBuffer(100),100);
                    text.ReleaseBuffer();
                    TextOutW(hdc,10,10,text,text.GetLength());
                }
                ReleaseDC(hWnd,hdc);
                SetCapture(hWnd);
                return 0;
            }
        case WM_LBUTTONUP:
            {
                HDC hdc;
                hdc = GetDC(hWnd);
                SelectObject(hdc,hbrBlack);
                Rectangle(hdc,0,0,100,50);
                SetTextColor(hdc,#000000);
                {
                    CString text;
                    ::GetWindowText(hWnd,text.GetBuffer(100),100);
                    text.ReleaseBuffer();
                    TextOutW(hdc,10,10,text,text.GetLength());
                }
                ReleaseDC(hWnd,hdc);
            
                BOOL bRet =  (GetCapture()==hWnd);
                ReleaseCapture();

                HWND parent = ::GetParent(hWnd);
                HMENU hMenu = ::GetMenu(hWnd);

                //POINT pt = MAKEPOINTS(lParam);
                POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
                RECT rect;
                ::GetClientRect(hWnd,&rect);
                bRet = bRet && ::PtInRect(&rect,pt);
                if (bRet)
                    ::SendMessage(parent,WM_COMMAND,(WPARAM)hMenu,NULL);
                return 0;
            }
        case WM_DESTROY:
            DeleteObject(hbrBlack);
            DeleteObject(hbrRed);
            return 0;
        }
        return DefWindowProcW(hWnd,uMsg,wParam,lParam);
    }


    LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_CREATE:
            {
                HINSTANCE hInstance = GetModuleHandleW(NULL);

                CreateWindowExW(0,L"Button",L"按键",WS_CHILD|WS_VISIBLE,0,0,100,50,hWnd,(HMENU)101,hInstance,NULL);
                CreateWindowExW(0,L"ControlClass",L"哈哈",WS_CHILD|WS_VISIBLE,200,200,100,50,hWnd,(HMENU)100,hInstance,NULL);
                CreateWindowExW(0,L"ControlClass",L"呵呵",WS_CHILD|WS_VISIBLE,400,400,100,50,hWnd,(HMENU)102,hInstance,NULL);

                return 0;
            }
        case WM_COMMAND:
            {
                int wmId    = LOWORD(wParam);
                CString msg;
                msg.Format(L"hWmd:0x%08x,wmId:%d",hWnd,wmId);
                MessageBox(hWnd,msg,L"提示",MB_OK|MB_ICONINFORMATION);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            break;
        }
        return DefWindowProcW(hWnd,uMsg,wParam,lParam);
    }

    int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,int nShowCmd)
    {
        HWND hWnd;
        WNDCLASSEXW wce = {0};
        MSG msg;

        RegisterControlClass(hInstance);

        wce.cbSize = sizeof(wce);
        wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wce.hCursor = LoadCursor(NULL,IDC_ARROW);
        wce.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        wce.hInstance = hInstance;
        wce.lpfnWndProc = MainWindowProc;
        wce.lpszClassName = L"MyWindowClass";
        wce.style = CS_HREDRAW|CS_VREDRAW;

        RegisterClassExW(&wce);

        hWnd = CreateWindowExW(0,L"MyWindowClass",L"测试",WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

        UpdateWindow(hWnd);
        ShowWindow(hWnd,nShowCmd);

        while(GetMessageW(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }   
        return 0;
    }


    天下 2016-01-20 11:23 发表评论


沪ICP备19023445号-2号
友情链接