CMFCColorDialog弹不出来或者CMFCColorButton的Other按钮无效

VS2008(SP1)在静态编译的程序中,可能VS2010也是一样. CMFCColorDialog弹不出来或者CMFCColorButton的Other按钮无效(其实本人目前发现这些新特性控件中CMFCEditBrowseCtrl控件的图标也是, CMFCTabCtrl控件创建成CMFCTabCtrl::STYLE_FLAT式样时也需要加载ribbon资源, 不然那些箭头不能显示),这时需要手动修改一下rc文件.

在Edit菜单中选择resource includes

在Read only symbol directives里面加入
#if !defined(_AFXDLL)
#include "afxribbon.rc"              // MFC ribbon and control bar resources
#endif

=============================================
插一句, 上面是在网上看到的, 其实不对的, 这里是今天修改的, 其实参考NewControls的列子, 用记事本打开*.rc文件修改后面的, 下面绿色粗体字是要自己添加的 (其实是用资源视图时, "编辑"->"资源包括", 在"编译时指令"中添加, 记得不要加错地方就行了)

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9, 1
#pragma code_page(1252)
#endif //_WIN32
#include "res\NewControls.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"         // Standard components
#ifndef _AFXDLL
#include "afxribbon.rc"      // Ribbon and control bars
#endif

#endif

===========================分割线==========================
CMFCColorButton的other按钮弹不出来颜色对话框,是因为CMFCColorButton默认使用CMFCColorDialog来弹出来的,而这个对话框需要手动编辑一下资源,但是添加"afxribbon.rc" 后出现资源错误,郁闷,55555抓狂.......不过可以修改CMFCColorButton弹出系统颜色对话框来.就是下面这样... CMFCColorButton::bAltColorDlg变量为FALSE即可....

#ifndef _AFXDLL
	m_ColorPicker.EnableOtherButton(_T("Other"), FALSE, TRUE);
#endif

========================简单自绘 CMFCColorButton=============================
//头文件MyColorButton.h

#pragma once
#include "afxcolorbutton.h"

class CMyColorButton :
	public CMFCColorButton
{
public:
	CMyColorButton(void);
	~CMyColorButton(void);

	virtual void OnDraw(CDC* pDC, const CRect& rect, UINT uiState);
	virtual	void OnDrawFocusRect(CDC* pDC, const CRect& rectClient);

};

//实现文件MyColorButton.cpp

#include "StdAfx.h"
#include "MyColorButton.h"

CMyColorButton::CMyColorButton(void)
{
}

CMyColorButton::~CMyColorButton(void)
{
}

void CMyColorButton::OnDraw(CDC* pDC, const CRect& rect, UINT uiState)
{
	ASSERT_VALID(pDC);

	if (m_pPalette == NULL)
	{
		RebuildPalette(NULL);
	}

	CPalette* pCurPalette = pDC->SelectPalette(m_pPalette, FALSE);
	pDC->RealizePalette();

	CSize sizeArrow = CMenuImages::Size();

	CRect rectColor = rect;

	COLORREF color = m_Color;
	if (color == (COLORREF) -1) // Automatic
	{
		//---------------------------
		// Draw automatic text label:
		//---------------------------
		color = m_ColorAutomatic;

	}

	//----------------
	// Draw color box:
	//----------------
	rectColor.DeflateRect(2, 2);
	pDC->Draw3dRect(rectColor, afxGlobalData.clrBtnHilite, afxGlobalData.clrBtnHilite);
	rectColor.DeflateRect(1, 1);
	pDC->Draw3dRect(rectColor, afxGlobalData.clrBtnDkShadow, afxGlobalData.clrBtnDkShadow);
	rectColor.DeflateRect(1, 1);

	if (color != (COLORREF)-1 && (uiState & ODS_DISABLED) == 0)
	{
		if (afxGlobalData.m_nBitsPerPixel == 8) // 256 colors
		{
			ASSERT_VALID(m_pPalette);
			color =  PALETTEINDEX(m_pPalette->GetNearestPaletteIndex(color));
		}

		CBrush br(color);
		pDC->FillRect(rectColor, &br);
	}	

	if (pCurPalette != NULL)
	{
		pDC->SelectPalette(pCurPalette, FALSE);
	}
}

void CMyColorButton::OnDrawFocusRect(CDC* pDC, const CRect& rectClient)
{
	CSize sizeArrow = CMenuImages::Size();

	CRect rectColor = rectClient;	

	CMFCButton::OnDrawFocusRect(pDC, rectColor);
}







如果你使用的用户代理字符串解析方法返回的设备名称为 "other",那是因为解析方法无法准识别设备名称,或者用户代理字符串中不包含明确的设备标识。 在某些情况下,用户代理字符串可能会被篡改、隐藏或包含非标准格式的信息,这可能导致解析结果不准确。因此,仅仅依赖用户代理字符串来获取设备名称可能是不可靠的。 如果你需要更准确地获取客户端设备名称,可以考虑使用其他技术手段,如 JavaScript、Cookie、IP 地址等。以下是一些额外的方法供你参考: 1. 使用 JavaScript:在前端页面中,使用 JavaScript 的 `navigator.userAgent` 属性可以获取客户端的用户代理字符串。你可以将该值通过 AJAX 请求发送到后端,并进行解析。 2. 使用第三方服务:有一些第三方服务可以提供设备识别功能,如 DeviceAtlas、WURFL 等。这些服务通常会提供 API,你可以使用 API 来获取更准确的设备信息。 3. 使用 Cookie:在客户端发送请求时,在服务端设置一个设备标识的 Cookie。这样,在后续的请求中,你可以通过读取该 Cookie 来获取设备信息。 4. 使用 IP 地址:根据客户端的 IP 地址,可以使用 IP 地址数据库来推断设备类型。这种方法可能不太准确,但可以作为一种参考。 需要根据你的具体需求选择合适的方法,并进行适当的验证和处理,以确保获取到准确的设备信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值