草庐IT

c++ - 是否可以更改只读编辑控件的背景颜色

coder 2024-02-03 原文

我一直试图找到一个简单的解决方案来更改具有 ES_READONLY 标志的编辑控件的颜色。当编辑控件可编辑时,我的代码(某种程度上)有效,但对我的具有只读标志的编辑控件没有影响。

case WM_CTLCOLOREDIT:
{
  HDC hdc = (HDC)wParam;
  //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam)
  //{
      SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white
      SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black
  //}
  return 0;
}
break;

我的评论只是为了检查我的代码是否有效,它在非只读的编辑控件上有效。如果我在我的其他编辑控件上删除 ES_READONLY,它就可以正常工作。我正在创建一个聊天程序,不希望用户能够在聊天框区域中输入内容。当它只读时,它会变成灰色,但我想要白色。还有另一种方法吗?此外,颜色仅对文本所在的区域着色,而不是编辑控件的整个高度。我做错了什么?

最佳答案

您需要创建一个画笔并跟踪它。然后在您的代码片段中返回此画笔而不是 return 0。一旦不再需要画笔,您必须将其删除。这通常是为了响应 WM_DESTROY 消息而完成的。

在你的情况下,你可以使用原厂刷来躲避子弹,这是我推荐的。

在只读模式下,编辑控件响应 WM_CTLCOLORSTATIC 而不是 WM_CTLCOLOREDIT,因此您必须正确处理此消息:

case WM_CTLCOLORSTATIC:
{
    if( (HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN) )
    {
        SetBkMode( (HDC)wParam, TRANSPARENT );  
        SetTextColor(hdc, RGB(255, 255, 255));
        return (LRESULT)( (HBRUSH)GetStockObject(BLACK_BRUSH) );  
        // if edit control is in dialog procedure change LRESULT to INT_PTR
    }
    else  // this is some other static control, do not touch it!!
        return DefWindowProc( hwnd, message, wParam, lParam );
}

绘画编辑/静态控制时,有3个部分可供绘画:

  • 文字颜色
  • 文字背景
  • 控制的背景

为了将整个控件绘制成所需的颜色,您必须返回具有所需颜色的画笔(return (LRESULT)someBrush 用于窗口过程,或 return (INT_PTR)someBrush 用于对话框)。

您对 SetBkColor 的调用设置了文本 背景的颜色,该颜色与控件的背景颜色不同。这就是为什么我们使用 TRANSPARENT 参数调用 SetBkMode 以“说”我们希望文本背景与控件的背景相匹配。

在你的情况下,我使用了库存刷,因为你不需要跟踪它,也不需要在不再需要它后删除它。

不过,在某些情况下您可能需要其他颜色。在这种情况下,您必须执行以下操作:

  • 在您的窗口/对话框过程中创建全局HBRUSH 变量或static HBRUSH 变量。
  • 如果在窗口过程中,初始化此变量以响应 WM_CREATE。如果在对话框程序中初始化画笔在WM_INITDIALOG。像 someBrush = CreateSolidBrush( RGB( 255, 0, 255 ) );documentation获取更多信息和示例。
  • 返回此画笔,就像我在上面的示例中向您展示的那样(return (LRESULT)someBrush 用于窗口过程,或 return (INT_PTR)someBrush 用于对话框)。
  • 不再需要时删除画笔。这通常在 WM_DESTROY 中通过 DeleteObject(someBrush); 调用完成。

我强烈建议您执行删除以响应 WM_DESTROY 而不是 WM_CLOSE 因为这是您的窗口将始终收到的消息,而 WM_CLOSE 有时可以跳过(在 Internet 上搜索此场景的示例)。

希望这对您有所帮助,如果您还有其他问题,请发表评论,我会尽力提供帮助。最好的问候。

关于c++ - 是否可以更改只读编辑控件的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27733552/

有关c++ - 是否可以更改只读编辑控件的背景颜色的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  3. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  4. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  6. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  9. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  10. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

随机推荐