zoukankan      html  css  js  c++  java
  • [置顶] VC++界面编程之--自定义CEdit(编辑框)皮肤

    自定义编辑框是登陆界面经常用到的效果,所以我也模仿站酷网的素材做了个微笑

    要想继承CCustomDraw来完全自绘CEdit控件,是不太可行的方案,因为一旦你完全重绘,那么你需要额外做以下几件事:

    1. CEdit光标的处理;

    2. 当是密码提示时,需要弹窗提示用户大写打开。

    3. 需要处理窗口文字的滚动。

    这样一来,工作量会很大,而且效果也不一定好。


    我这里想到相对比较好的解决方案是:子窗口+透明边框的CEdit。子窗口负责皮肤的绘制,而CEdit负责处理用户的输入。这样一来,可以利用到CEdit原有的一些特性,以保证原有的效果,并减轻我们开发的工作量。

    如下图的密码输入框侦测到用户键盘大写打开时,CEdit也会提示用户大写已经打开:



    CEdit制作透明背景的方式是:

    1. 子窗口获取WM_CTLCOLOREDIT和WM_CTLCOLORSTATIC这两个消息,当CEdit为ReadOnly时会响应WM_CTLCOLORSTATIC。

    2. 在这两个消息中,返回背景画刷。

    	LRESULT OnCtlColorEdit(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    	{
    		CDCHandle dc( (HDC) wParam );
    		dc.SetTextColor(m_clrText);
    		dc.SetBkMode(TRANSPARENT);
    
    		// The AtlGetBackgroundBrush will repaint window.
    		if( m_brEditBack.m_GDIBrush.m_hBrush == NULL ) 
    		{
    			m_brEditBack.GetBackGroundBrush(m_Edit.m_hWnd, m_hWnd);
    		}
    
    		return (LRESULT)m_brEditBack.m_GDIBrush.m_hBrush;
    	}

    总结了下,有些Windows控件看起来简单,但要想完全实现其效果,也得花很多功夫。能利用Windows现有的东西就尽量利用,不要一直想着完全重写。

    本文源码下载链接:http://download.csdn.net/detail/renstarone/6399469

  • 相关阅读:
    ie浏览器设定主页修改
    诺基亚5800通讯录倒入到dopod的联系人中去的解决办法
    局域网中根据IP地址反查主机的名称(C#)
    U盘维修
    查找xml文件中某接点的值
    如何更改任务栏颜色
    如何给一个div赋值(改变div原来的值)
    explicit的作用
    重建二叉树
    常函数
  • 原文地址:https://www.cnblogs.com/pangblog/p/3370792.html
Copyright © 2011-2022 走看看