如何更改Edit控件文本被选中的蓝色?

中才德创 2010-04-01 07:11:34
如题。
...全文
1074 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2010-04-17
  • 打赏
  • 举报
回复
CRichEdit与CEdit的区别是什么?CRichEdit行吗?
hankcs 2010-04-14
  • 打赏
  • 举报
回复
这个问题很有意思,关注关注
FireBirdCN 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 firebirdcn 的回复:]
引用 33 楼 hawkofwinter 的回复:
引用 32 楼 firebirdcn 的回复:
建议直接改windows系统设置更快一些
立竿见影 简单易行~
实际上不可行!


桌面右键--属性--外观--高级--项目里选择 已选定的项目 把右边的颜色改成自己需要的颜色
你再试试管不管用~
[/Quote]

还是说 你不想用这种方法而已。。。
FireBirdCN 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 hawkofwinter 的回复:]
引用 32 楼 firebirdcn 的回复:
建议直接改windows系统设置更快一些
立竿见影 简单易行~
实际上不可行!
[/Quote]

桌面右键--属性--外观--高级--项目里选择 已选定的项目 把右边的颜色改成自己需要的颜色
你再试试管不管用~
中才德创 2010-04-12
  • 打赏
  • 举报
回复
void CSilverTree::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pNMTVCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);

if (!this->IsWindowEnabled())
{
*pResult = CDRF_DODEFAULT;
return;
}

switch (pNMTVCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}

case CDDS_ITEMPREPAINT:
{
*pResult = CDRF_NOTIFYPOSTPAINT;
return;
}

case CDDS_ITEMPOSTPAINT:
{
HTREEITEM hItem = (HTREEITEM)pNMTVCD->nmcd.dwItemSpec;
CDC *pDC = CDC::FromHandle(pNMTVCD->nmcd.hdc);
CRect rcText;
GetItemRect(hItem, &rcText, TRUE);
CString strText = GetItemText(hItem);
if (pNMTVCD->nmcd.uItemState & (CDIS_SELECTED|CDIS_FOCUS))
{
pDC->FillSolidRect(&rcText, RGB(179,179,179));
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->TextOut(rcText.left+2, rcText.top+2, strText);
}
else
{
pDC->FillSolidRect(&rcText, GetSysColor(COLOR_WINDOW));
pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
pDC->TextOut(rcText.left+2, rcText.top+2, strText);
}
*pResult = 0;
return;
}

default:
{
*pResult = CDRF_DODEFAULT;
return;
}
}
}
可以仿效树的如此做法吗?
中才德创 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 firebirdcn 的回复:]
建议直接改windows系统设置更快一些
立竿见影 简单易行~
[/Quote]实际上不可行!
FireBirdCN 2010-04-12
  • 打赏
  • 举报
回复
建议直接改windows系统设置更快一些
立竿见影 简单易行~
中才德创 2010-04-12
  • 打赏
  • 举报
回复
void CMyTree::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);
switch (pNMCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
return;

case CDDS_ITEMPREPAINT:
if (this->IsWindowEnabled())
{
if ((pNMCD->nmcd.uItemState&(CDIS_FOCUS))==0 &&
(pNMCD->nmcd.uItemState&(CDIS_SELECTED))==CDIS_SELECTED) //selected
{
pNMCD->clrTextBk = RGB(255, 255, 255);
pNMCD->clrText = RGB(0, 0, 0);
}
*pResult = CDRF_NOTIFYPOSTPAINT;
return;
}
else
{
*pResult = CDRF_DODEFAULT;
return;
}

case CDDS_ITEMPOSTPAINT:
if (this->IsWindowEnabled())
{
HTREEITEM hItem = (HTREEITEM)pNMCD->nmcd.dwItemSpec;
CDC *pDC = CDC::FromHandle(pNMCD->nmcd.hdc);
CRect rcText;
GetItemRect(hItem, &rcText, true);
CString strText = GetItemText(hItem);
if (pNMCD->nmcd.uItemState & (CDIS_SELECTED|CDIS_FOCUS))
{
CPen penGray(PS_SOLID, 1, RGB(179,179,179));
CBrush br;
br.CreateSolidBrush(RGB(179,179,179));
CBrush *pBrush = &br;
CBrush *pOldBrush = pDC->SelectObject(pBrush);
CPen *pOldPen = pDC->SelectObject(&penGray);
pDC->Rectangle(&rcText);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
pDC->FillSolidRect(&rcText, RGB(179,179,179));
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->TextOut(rcText.left+2, rcText.top+2, strText);
*pResult = CDRF_SKIPDEFAULT;
}
else
{
pDC->FillSolidRect(&rcText, RGB(255,255,255));
pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
pDC->TextOut(rcText.left+2, rcText.top+2, strText);
*pResult = CDRF_DODEFAULT;
}
return;
}
else
{
*pResult = CDRF_DODEFAULT;
return;
}
}
}
以上实现 树 所有功能了
中才德创 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 baili35 的回复:]
onctrcolor处理这个消息就可以了
[/Quote]如何处理?
baili35 2010-04-09
  • 打赏
  • 举报
回复
onctrcolor处理这个消息就可以了
zhllxt 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hawkofwinter 的回复:]
C/C++ code
void CMyList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

// TODO: Add your code to draw the specified item
TCHAR lpBuffer[256];

LV_COLUMN lvc, lvcprev;
::Zero……
[/Quote]
ListCtrl之类的很简单啊,你中人在相应的位置画上相应的文字就可以了,Edit不一样啊,Edit里有光标,我要判断当前光标在哪个位置,用户按了删除键,你要删除最后一个字符,同时更改光标位置,首先这个光标位置就很难确定,你要根据当前文字的大小,字体等计算文字的长度,然后把光标放在相应的位置,你在用鼠标拖动选择时要计算拖动时鼠标移动的长度,再计算文字的长度,从而确定蓝底应该到哪个字那儿结束,等等等等,你看孙鑫有一篇讲座,大致讲过这个,他那个讲的也很粗糙,就是因为这玩意要考虑的东西太多了,逻辑性太大,所以完全没有必要搞这个,在我看过的界面自绘中,所有的编辑框选中时的蓝底都没有变,还是蓝底,你看QQ,自绘的很不错了,选中时还是默认的蓝底,
所以放弃算了,真是吃力不讨好的事啊。
中才德创 2010-04-06
  • 打赏
  • 举报
回复
为什么List control有void CMyList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)虚函数,而Tree或Edit都没有呢?

这是怎么回事?
中才德创 2010-04-06
  • 打赏
  • 举报
回复
void CMyList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

// TODO: Add your code to draw the specified item
TCHAR lpBuffer[256];

LV_COLUMN lvc, lvcprev;
::ZeroMemory(&lvc, sizeof(lvc));
::ZeroMemory(&lvcprev, sizeof(lvcprev));
lvc.mask = LVCF_WIDTH | LVCF_FMT;
lvcprev.mask = LVCF_WIDTH | LVCF_FMT;

for (int nCol=0; GetColumn(nCol,&lvc); nCol++)
{
if (nCol > 0)
{
// Get Previous Column Width in order to move the next display item
GetColumn(nCol-1, &lvcprev);
lpDrawItemStruct->rcItem.left += lvcprev.cx;
lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left;
}

// Get the text
LV_ITEM lvi;
::ZeroMemory(&lvi, sizeof(lvi));
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = lpDrawItemStruct->itemID;
lvi.iSubItem = nCol;
lvi.pszText = lpBuffer;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));

CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(125, 125, 125));
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));

}
else
{
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_WINDOW));
pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
}

pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));

UINT uFormat = DT_LEFT;

::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &lpDrawItemStruct->rcItem, uFormat);

pDC->SelectStockObject(SYSTEM_FONT);
}
}

void CMyList::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0, LVS_OWNERDRAWFIXED); //for skin

CListCtrl::PreSubclassWindow();
}
也许有参考价值
辰岡墨竹 2010-04-05
  • 打赏
  • 举报
回复
你可以处理WM_MOUSEMOVE事件,直接重置CEdit的SetSel(-1, -1),可能需要UpdateData(FALSE)。
如果想改选中的样式,需要WM_OWNERDRAW,然后自己绘制文本框。
中才德创 2010-04-05
  • 打赏
  • 举报
回复
其实就是不希望控件出现蓝色的情状。

现在是拖选的时候,出现了。
hilevel 2010-04-05
  • 打赏
  • 举报
回复
我只想说,有难度
中才德创 2010-04-05
  • 打赏
  • 举报
回复
需求比较特殊
Dingnifei123 2010-04-05
  • 打赏
  • 举报
回复
这个需求比较特殊?

能问这么做的理由吗?

帮顶!
中才德创 2010-04-05
  • 打赏
  • 举报
回复
void CMyEdit::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
int begin, end;
GetSel(begin, end);

HDC hdc = dc.GetSafeHdc();
if ((0!=begin) && (0!=end))
{
// 有字被选中
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(250, 0, 0));
SetBkColor(hdc, RGB(0, 0, 0));
}
else
{
}

// Do not call CEdit::OnPaint() for painting messages
}


处理OnPaint消息:根据选中文本设置选择颜色
不会是句思想上的作业吧?

具体如何操作?上面代码劳而无获。
iswjh 2010-04-05
  • 打赏
  • 举报
回复
只有通过自绘。新建一个CmyEdit类从CEdit继承
处理OnPaint消息:根据选中文本设置选择颜色
加载更多回复(18)

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧