用户登录  |  用户注册
首 页源码下载网络学院最新源码源码排行屏蔽广告
当前位置:新兴网络 > 网络学院 > 编程开发 > C/C++

VC++ 对指定控件进行子类化操作

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2011-03-03 13:21:20

VC++ 对指定控件进行子类化操作,以下实例演示了通过子类化限制文本框只能输入浮点数以及实现Static 的超链接效果。

C/C++ code复制代码
#include <windows.h>
#include "resource.h"

// 手型光标的资源定义
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif

// 全局变量,用于保存默认的Edit、Static窗口过程以便子类化窗口调用
WNDPROC EditProc, StaticProc;

// 浮点数输入框的子类化窗口过程
LRESULT CALLBACK ProcFloat(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  // 不允许数字、小数点、退格之外的任何输入
  if (Msg == WM_CHAR && wParam != '.' && (wParam <= '0' || wParam >= '9') && wParam != VK_BACK)
  {
    // 发出声音表示警告
    MessageBeep(MB_OK);
    return 0;
  }
  else
    // 如果是其它消息,则调用原有的窗口过程
    return CallWindowProc(EditProc, hWnd, Msg, wParam, lParam);
}

// 超级链接的子类化窗口过程
LRESULT CALLBACK ProcLink(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch (Msg)
  {
  case WM_SETCURSOR:
    // 当鼠标移至链接上时,改变光标
    SetCursor(LoadCursor(NULL, IDC_HAND));
    break;
  case WM_LBUTTONDOWN:
    // 打开链接
    ShellExecute(NULL, "open", "http://home.ncust.edu.cn/~titilima", NULL, NULL, SW_SHOWNORMAL);
    break;
  default:
    // 如果是其它消息,则调用原有的窗口过程
    return CallWindowProc(StaticProc, hWnd, Msg, wParam, lParam);
  }
  return 0;
}

// 主窗口对话框窗口过程
LRESULT CALLBACK ProcMain(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch (Msg)
  {
  case WM_INITDIALOG:
    // 进行子类化,保存原窗口过程
    EditProc = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, IDC_EDIT), GWL_WNDPROC, (LONG)ProcFloat);
    StaticProc = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, IDC_ST_HOMEPAGE), GWL_WNDPROC, (LONG)ProcLink);
    break;
  case WM_CLOSE:
    // 最小化
    ShowWindow(hDlg, SW_MINIMIZE);
    break;
  case WM_COMMAND:
    // 退出
    if (LOWORD(wParam) == IDC_BTN_EXIT)
      EndDialog(hDlg, 0);
    break;
  case WM_CTLCOLORSTATIC:
    // 改变超级链接的颜色
    if (GetDlgItem(hDlg, IDC_ST_HOMEPAGE) == (HWND)lParam)
    {
      // 设置文本颜色
      SetTextColor((HDC)wParam, 0xff0000);
      // 设置背景模式为透明
      SetBkMode((HDC)wParam, TRANSPARENT);
      // 返回DC的画刷
      return (LRESULT)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
    }
    break;
  case WM_DESTROY:
    // 退出处理
    PostQuitMessage(0);
    break;
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  // 显示主窗口对话框
  DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)ProcMain, 0);
  return 0;
}
附件下载.rar

Tags:VC++ 子类化 控件

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      100%(3)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

网络学院评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 1 条,得分 100 分,平均 100 分) 查看完整评论
[回复] 1dsa是   打分:100 分  发表时间:2017-04-07
· sdas范德萨