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

本文详细介绍了WTL框架中CUpDownCtrl控件的使用方法,包括创建控件所需的样式参数及其作用,如UDS_AUTOBUDDY、UDS_SETBUDDYINT等,并提供了处理非整数型文本的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值