win32 绘制超酷界面(一)

来源:互联网 发布:梦幻西游手游秒抢软件 编辑:程序博客网 时间:2024/05/17 07:39

一般来说,在项目中为了更友好的提示用户,我们一般会采用弹出对话框的实施方案。可是我们在实际的应用中,往往要自己定义一个界面,取代系统的对话框。在win API中,那个对话框就别提了【吐槽:我是不想用,不好看】

废话就不多说了,直接进入主题。今天的自定义对话框就是一个窗体。
这里写图片描述

今天只是实现一个传说中的按钮,功能以后实现,实现效果如下
这里写图片描述


  1. 用VS新建一个win32工程【也可以自己建立一个空的工程,这里不是重点】,我的工程名字为:WndEx;
  2. 添加菜单【省略】

  3. 添加两个文件About.h和About.cpp,分别喜爱那个文件添加代码
    file : About.h

#ifndef About_h#define About_hvoid OnMenuAbout(); // 在消息处理函数,菜单点击时调用#endif

file:About.cpp

#include "stdafx.h"#include "About.h"#include "resource.h"#define MAX_LOADSTRING 100#define WND_CLASS_ABOUT L"CLASS_ABOUT" // 创建的窗口ID#define ABOUT_WIN_TITLE L"About"       // 窗口标题

3.1 注册,创建一个窗口类

void OnMenuAbout(){    HWND About;    HINSTANCE hInstance = GetModuleHandle(NULL);    WNDCLASSEX  wcex;    ZeroMemory(&wcex, sizeof(WNDCLASSEX));    wcex.cbSize         = sizeof(WNDCLASSEX);    wcex.style          = CS_HREDRAW | CS_VREDRAW;    wcex.hInstance      = GetModuleHandle(NULL);    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);    wcex.lpszClassName  = WND_CLASS_ABOUT;    wcex.lpfnWndProc    = (WNDPROC)AboutProc; // 消息处理函数,实现在后边    wcex.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_WNDEX));    RegisterClassEx(&wcex);    About = CreateWindow(            WND_CLASS_ABOUT, ABOUT_WIN_TITLE,            WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,            CW_USEDEFAULT, CW_USEDEFAULT,            400, 250,            NULL, NULL,            hInstance, NULL);    if (!About)        return;    ShowWindow(About, SW_SHOW);}

3.2 消息处理函数

INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){    HDC hdc;    switch (msg) {        case WM_CREATE:            break;        case WM_PAINT:            PAINTSTRUCT ps;            hdc = BeginPaint(hwnd, &ps);            OnPaint(hwnd, hdc); // 绘制界面            EndPaint(hwnd,&ps);            break;        case WM_DESTROY:            DestroyWindow(hwnd);            break;        default:            return DefWindowProc(hwnd, msg, wParam, lParam);    }    return 0;}

3.3 界面绘制的实现

void OnPaint(HWND hwnd, HDC hdc){    RECT rc;    GetClientRect(hwnd, &rc);    SetBkMode(hdc, TRANSPARENT);    HBRUSH br = CreateSolidBrush(RGB(0xff,0xff,0xff));    FillRect(hdc, &rc, br);    const WCHAR *Name = L"BUTTON";    SIZE txtSize;    GetTextExtentPoint32(hdc, Name, wcslen(Name), &txtSize);    RECT rcButton;    rcButton.left = (rc.right - rc.left - txtSize.cx)/2 - 5;    rcButton.right = (rc.right + rc.left + txtSize.cx)/2 + 5;    rcButton.top = rc.bottom - txtSize.cy - 30;    rcButton.bottom = rc.bottom - 20;    HBRUSH br2 = CreateSolidBrush(RGB(0x00,0x99,0x00));    FillRect(hdc, &rcButton, br2);    SetTextColor(hdc, RGB(0xff,0xff,0xff));    TextOut(hdc, rcButton.left+5, rcButton.top+5, Name, wcslen(Name));    DeleteObject(br);    DeleteObject(br2);}

项目中用到的真实案例,希望相互学习。如果有什么不足,一起交流学习。

0 0
原创粉丝点击