zoukankan      html  css  js  c++  java
  • 自已动手写控件 我第一次学习写自定义控件

      一直都是用系统的控件, 还从不知道一个控件该怎么去写~~~

      网上的教程太少了, 完全不知道怎么开头~~

      也一直用 RegisterClassEx + CreateWindowEx 创建一个主程序窗口, 却从不知道控件也是通过这种方式来写的.
    看来我们无时无刻不在自己写控件啊~~~

      第1次写控件, 介绍一下我写的这个简单功能控件的创建过程:
        1. 为控件写一个窗口类,指定默认窗口函数,并注册窗口类
        2. 调用 CreateWindowEx 创建该子控件即可, 和创建主窗口完全一样
      
      重点:
        指定的窗口过程必须要为自己的子控件做好相应的消息处理:比如:鼠标消息, WM_PAINT等~~~

      汗, 第1次写这种东西, 没有什么经验, 也没有什么好说的, 就给和我一样不会写控件的一个示范吧, 贴代码, 不多说~~~

      实现的功能是:当点击控件时, 控件的背景颜色会发生变化~~~
      
      没什么特别的意义, 只是想告诉不会写控件的大家, 该怎样开始写一个控件~~~


    // TestControl.c
    #include <windows.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(RGB(0,0,0));
                hbrRed = CreateSolidBrush(RGB(255,0,0));
    
                return 0;
            }
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc;
                
                hdc = BeginPaint(hWnd,&ps);
                SelectObject(hdc,hbrBlack);
                Rectangle(hdc,0,0,100,50);
                EndPaint(hWnd,&ps);
                return 0;
    
            }
        case WM_LBUTTONDOWN:
            {
                HDC hdc;
                hdc = GetDC(hWnd);
                SelectObject(hdc,hbrRed);
                Rectangle(hdc,0,0,100,50);
                SetTextColor(hdc,RGB(255,0,0));
                TextOutW(hdc,10,10,L"测试控件",4);
                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,RGB(0,0,0));
                TextOutW(hdc,10,10,L"测试控件",4);
                ReleaseDC(hWnd,hdc);
                ReleaseCapture();
                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_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;
    }

    有图有真相, 字体有点丑, 不过将就, 系统默认字体都这样:
      

    女孩不哭 @ 2013-05-16 02:47:56 @ http://www.cnblogs.com/nbsofer

  • 相关阅读:
    Java再学习——栈(stack)和堆(heap)
    Java再学习——深究static关键字
    毕业设计进度:3月4日
    毕业设计进度:3月3日
    可视化组件:echarts柱状图添加点击事件
    毕业设计进度:2月29日
    毕业设计进度:2月28日
    毕业设计进度:2月27日
    毕业设计进度:2月26日
    毕业设计进度:2月25日
  • 原文地址:https://www.cnblogs.com/memset/p/3081082.html
Copyright © 2011-2022 走看看