[WTL/ATL]_[初级]_[微调控件CUpDownCtrl的使用]

Posted infoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[WTL/ATL]_[初级]_[微调控件CUpDownCtrl的使用]相关的知识,希望对你有一定的参考价值。

场景

  1. 开发WTL/ATL应用时,有时候需要对某些值进行微调,比如0-100的百分比的微调,或者字号的微调,通过键盘操作微调控件,能实时查看某些界面呈现的效果。而WTL提供了CUpDownCtrl控件,这是对Win32 Up-Down控件[1]的封装. 那么这个类如何用?
    图1

说明

  1. 创建CUpDownCtrl,需要传递某些样式. 注意,它的朋友窗口CEdit需要在upDown之前创建。除此之外,CUpDownCtrl也不需要指定区域大小,因为他会根据CEidt进行适配,你无法通过CRect修改它的大小。

    • UDS_AUTOBUDDY: 自动选择在z方向的之前创建的窗口作为朋友buddy窗口。 UpDown控件可以通过朋友窗口的大小自动适配,比如改变朋友CEdit控件的高度,那么UpDown的高度也会随着增加。
    • UDS_ARROWKEYS: 可以使用上下方向键来促使UpDown控件递增和递减.
    • UDS_SETBUDDYINT: 让UpDown控件调用SetWindowText来设置朋友控件的整型值.
    • UDS_HOTTRACK: 鼠标移动到UpDown控件上时显示高亮效果。
    edit_.Create(m_hWnd,CRect(CPoint(40,100),CSize(90,26)),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,
    0,kSampleContentEditupDown);
    edit_.SetFocus();
    
    upDownQuality_.Create(m_hWnd,CRect(CPoint(),CSize()),NULL,WS_CHILDWINDOW|WS_BORDER | WS_VISIBLE  | UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_HOTTRACK,0,kSampleContentQualityUpDown);
    
  2. 如果在文本框里需要增加非整型的字符串,比如百分比符号99%,那么,创建的时候不要传递UDS_SETBUDDYINT样式。在点击UpDown控件时就不会调用CEditSetWindowText设置值。这时需要添加消息映射处理通知UDN_DELTAPOS.

    NOTIFY_HANDLER_EX(kSampleContentQualityUpDown,UDN_DELTAPOS,onUpDownChange)
    
    int CView::getQualityValue()
    
    	wchar_t buf[8] = 0;
    	edit_.GetWindowText(buf,sizeof(buf));
    
    	int value = 0;
    	if(buf[wcslen(buf)-1] == L'%')
    		buf[wcslen(buf)-1] = L'\\0';
    		value = _wtoi(buf);
    	else
    		value = _wtoi(buf);
    		setQualityEditValue(value);
    	
    	return value;
    
    
    
    void CView::setQualityEditValue(int value)
    
    	wchar_t buf[8] = 0;
    	wsprintf(buf,L"%d%%",value);
    	edit_.SetWindowText(buf);
    
    
    LRESULT CView::onUpDownChange(LPNMHDR pnmh)
    
    	auto upDownData = (LPNMUPDOWN)pnmh;
    	setQualityEditValue(upDownData->iPos);
    	return 0;
    
    

例子

View.h

// View.h : interface of the CView class
//
/

#ifndef VIEW_H
#define VIEW_H

class BASEdit;

typedef enum ViewWindowId1 
	kSampleContentQualityUpDown = WM_USER + 1000,
	kSampleContentEditupDown
ViewWindowId;

class CView : public CWindowImpl<CView>

public:
	DECLARE_WND_CLASS(NULL)

	BOOL PreTranslateMessage(MSG* pMsg);

	BEGIN_MSG_MAP_EX(CView)
		MSG_WM_CREATE(onCreate)
		MESSAGE_HANDLER(WM_PAINT, onPaint)
		NOTIFY_HANDLER_EX(kSampleContentQualityUpDown,UDN_DELTAPOS,onUpDownChange)
		REFLECT_NOTIFICATIONS()
	END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

protected:
	LRESULT onPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
	int onCreate(LPCREATESTRUCT lpCreateStruct);
	void onEnter();
	LRESULT onUpDownChange(LPNMHDR pnmh);
	void setQualityEditValue(int value);
	int getQualityValue();

private:
	CEdit edit_;
	CUpDownCtrl upDownQuality_;
;

#endif

View.cpp

// View.cpp : implementation of the CView class
//
/

#include "stdafx.h"
#include "resource.h"

#include "View.h"
#include <functional>


BOOL CView::PreTranslateMessage(MSG* pMsg)

	pMsg;
	return FALSE;


void CView::onEnter()

	


int CView::getQualityValue()

	wchar_t buf[8] = 0;
	edit_.GetWindowText(buf,sizeof(buf));

	int value = 0;
	if(buf[wcslen(buf)-1] == L'%')
		buf[wcslen(buf)-1] = L'\\0';
		value = _wtoi(buf);
	else
		value = _wtoi(buf);
		setQualityEditValue(value);
	
	return value;



void CView::setQualityEditValue(int value)

	wchar_t buf[8] = 0;
	wsprintf(buf,L"%d%%",value);
	edit_.SetWindowText(buf);


LRESULT CView::onUpDownChange(LPNMHDR pnmh)

	auto upDownData = (LPNMUPDOWN)pnmh;
	setQualityEditValue(upDownData->iPos);
	return 0;


int CView::onCreate(LPCREATESTRUCT lpCreateStruct)

	edit_.Create(m_hWnd,CRect(CPoint(40,100),CSize(90,26)),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,
		0,kSampleContentEditupDown);
	edit_.SetFocus();

	//UDS_SETBUDDYINT: 自动设置Edit的整型值
	upDownQuality_.Create(m_hWnd,CRect(CPoint(),CSize()),NULL,WS_CHILDWINDOW|WS_BORDER | WS_VISIBLE 
                              | UDS_AUTOBUDDY | UDS_ALIGNRIGHT 
							  | UDS_ARROWKEYS | UDS_HOTTRACK,0,kSampleContentQualityUpDown);
	upDownQuality_.SetRange(0,100);

	auto kQualityDefaultValue = 90;
	upDownQuality_.SetPos(kQualityDefaultValue);
	setQualityEditValue(kQualityDefaultValue);

	return 0;


LRESULT CView::onPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

	CPaintDC dc(m_hWnd);

	//TODO: Add your drawing code here

	return 0;



图二

参考

  1. up-down-control-reference

  2. create-an-up-down-control

  3. up-down-control-styles

以上是关于[WTL/ATL]_[初级]_[微调控件CUpDownCtrl的使用]的主要内容,如果未能解决你的问题,请参考以下文章

[WTL/ATL]_[中级]_[自定义TrackBar]

[WTL/ATL]_[中级]_[自定义TrackBar]

[WTL/ATL]_[初级]_[使用虚拟列表视图来解决新增大量数据卡顿问题]

[WTL/ATL]_[初级]_[使用虚拟列表视图来解决新增大量数据卡顿问题]

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]