子类化控件

原创 2013年04月15日 17:35:00
今天用到IP Address Control,使用时发现,如果用在MFC程序里面,他会自动判断输入是否合法,
但如果是Win32程序,他只能禁止输入字母,不能处理鼠标右键粘贴功能和“Ctrl+V”功能,

我试着子类化处理WM_PASTE和WM_RBUTTONDOWN消息,但发现Edit控件可以用这个办法,IP Address Control处理不了这两个消息。


现在还是不知道IP Address Control这个控件如何处理,后续弄明白了在来更新,先记录一下如何子类化Edit,代码如下(转载):



#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;
}


MFC子类化控件

转自:代码小卒的文章MFC子类化控件子类化理解作为一个程序员,我们经常会在程序中用到Windows通用控件。比如按钮控件,进度条控件等等。但是有时我们需要给控件更多的特色,这就需要做控件的子类化(su...
  • xuanyuanlei1020
  • xuanyuanlei1020
  • 2016年10月31日 11:59
  • 760

Qt学习笔记外观篇(五):子类化窗口部件类

如前所述,自定义
  • wangyanphp
  • wangyanphp
  • 2014年08月27日 10:02
  • 2127

控件子类化与控件超类化

子类化:子 类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息。一个应用程序通过截获属于另一个窗口的消息,从而实现增加、监视或者修改那个窗口的缺 省行为。子类化是用来改变或者扩展一个已存在...
  • mm_lvw
  • mm_lvw
  • 2011年06月02日 17:39
  • 2326

控件子类化

当程序使用你自已所实现的派生控件子类时,主窗口的消息是无法到达你的子类函数的.这时,你有两个方法:1.       使用DDX_Contrl(pDX,IDC_BUTTON,mMyButton)把你的子...
  • sjcode
  • sjcode
  • 2007年09月07日 19:02
  • 1088

qt学习第四课:子类化窗口

在本节课中,学习了如何子类化一个窗口,在下面就以经常用到的查找对话框为例: 具体的运行结果如下: 这个对话框就是一个基于QDialog的子类。 具体代码如下: #ifndef ...
  • u011619422
  • u011619422
  • 2015年08月01日 15:38
  • 963

走出MFC子类化的迷宫:子类化,SUBCLASSWINDOW ,MFC消息机制

   许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习,有些人可能对子类化机制比较陌生。        我们先看看什么是Windows的子类化。Wi...
  • oathevil
  • oathevil
  • 2010年08月09日 22:15
  • 436

控件子类化的两种方式

1.  给控件关联变量,修改类名2.  定义一个成员变量,如CPassButton btn;       然后btn.SubclassDlgItem(IDC_BUTTON2, this);    ID...
  • PeterPan19890802
  • PeterPan19890802
  • 2010年05月15日 11:13
  • 402

超类化与子类化的区别?

本文转自:http://hi.baidu.com/zish/blog/item/2a4098501bef706a853524ca.html 1.子类化:改变一个已经存在的窗口实例的性质:消息处理与其他...
  • FlowShell
  • FlowShell
  • 2009年12月10日 20:59
  • 3138

[学习笔记]窗口子类化实例

窗口子类化实例:点击一个按钮,在按钮本身的消息(按钮的消息回调函数)中弹出对话框,而不是在COMMAND(父类的消息回调函数)消息中弹出对话框。...
  • cyxvc
  • cyxvc
  • 2015年10月02日 18:43
  • 455

向RichEditCtrl中添加图片和URL功能

最近在写一个工具,需要用到RichEditCtrl控件,这个控件需要支持图片和URL超链接功能。查看了Codeguru和codeproject网站中文章的描述,其中实现的主要部分代码如下。 if (F...
  • whf727
  • whf727
  • 2009年05月14日 18:18
  • 823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:子类化控件
举报原因:
原因补充:

(最多只允许输入30个字)