标签: editcontrol

在编辑控件中显示无效输入的工具提示

我有子类编辑控件只接受浮动数字.我想在用户输入无效时弹出工具提示.我的目标行为就像一个带有的编辑控件ES_NUMBER:

在此输入图像描述

到目前为止,我能够实现跟踪工具提示并在用户进行无效输入时显示它.

但是,工具提示是错误的.我试图使用ScreenToClientClientToScreen修复此问题但失败了.

以下是创建SCCE的说明:

1)在Visual Studio中创建默认的Win32项目.

2)在您的stdafx.h下方添加以下内容#include <windows.h>:

#include <windowsx.h>
#include <commctrl.h>

#pragma comment( lib, "comctl32.lib")

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='Microsoft.Windows.Common-Controls' "\
    "version='6.0.0.0' "\
    "processorArchitecture='*' "\
    "publicKeyToken='6595b64144ccf1df' "\
    "language='*'\"")
Run Code Online (Sandbox Code Playgroud)

3)添加这些全局变量:

HWND g_hwndTT;
TOOLINFO g_ti;
Run Code Online (Sandbox Code Playgroud)

4)这是编辑控件的简单子类过程(仅用于测试目的):

LRESULT CALLBACK EditSubProc ( HWND hwnd, UINT message, 
    WPARAM wParam, LPARAM lParam, 
    UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
{
    switch (message)
    {
    case WM_CHAR:
        {
            POINT pt;
            if( ! isdigit( wParam ) ) …
Run Code Online (Sandbox Code Playgroud)

c++ winapi tooltip editcontrol

11
推荐指数
2
解决办法
3040
查看次数

编辑控件中的搜索图标与输入区域重叠

我试图在MFC中创建一个搜索编辑控件,它始终在控件窗口中显示一个图标(无论控件的状态和文本如何).我多年前写过类似的东西并且运行得很好,但代码不再适用于Windows 7及更新版本(甚至可能是Vista,但没有尝试过).发生的情况是控件中显示的图像与输入区域重叠(参见下图).

代码背后的想法:

  • 有一个派生自的类CEdit(在OnPaint中处理绘画)
  • 右侧显示图标,根据图标的大小缩小编辑区域
  • 对于单行和多行编辑,调整大小的方式不同.对于单行,我调用SetMargins,对于多行编辑,我调用SetRect.
  • 此编辑调整大小应用于PreSubclassWindow(),OnSize()OnSetFont()

这是编辑输入大小的应用方式:

void CSymbolEdit::RecalcLayout()
{
    int width = GetSystemMetrics( SM_CXSMICON );

    if(m_hSymbolIcon)
    {
      if (GetStyle() & ES_MULTILINE)
      {
         CRect editRect;
         GetRect(&editRect);

         editRect.right -= (width + 6);

         SetRect(&editRect);
      }
      else
      {
         DWORD dwMargins = GetMargins();
         SetMargins(LOWORD(dwMargins), width + 6);
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

下图显示了单行编辑的问题(图像已放大以获得更好的视图).黄色背景仅用于突出显示,在实际代码中我使用COLOR_WINDOW系统颜色.您可以看到,当单行编辑具有文本并具有输入时,左侧图像将被绘制.对于SetRect正确设置格式矩形的多行编辑,不会发生这种情况.

在此输入图像描述

我尝试使用ExcludeClipRect删除正在显示图像的编辑区域.

CRect rc;
GetClientRect(rc);

CPaintDC dc(this);
ExcludeClipRect(dc.m_hDC, rc.right - width - 6, rc.top, rc.right, rc.bottom); …
Run Code Online (Sandbox Code Playgroud)

c++ mfc paint editcontrol visual-c++

8
推荐指数
1
解决办法
462
查看次数

TEdit和WM_PAINT消息处理程序的奇怪行为

我试图在TEdit没有焦点的控件上实现我自己的绘图(TEdit当编辑器没有完全显示其文本时显示省略号).所以我用这段代码加注了ed:

type
  TEdit = class(StdCtrls.TEdit)
  private
    FEllipsis: Boolean;
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

constructor TEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEllipsis := False;
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;

destructor TEdit.Destroy;
begin
  FCanvas.Free;
  inherited;
end;

procedure TEdit.WMPaint(var Message: TWMPaint);
begin
  if FEllipsis and (not Focused) then
  begin
    // Message.Result := 0;
    // TODO...
  end
  else
    inherited;
end;
Run Code Online (Sandbox Code Playgroud)

请注意,当FEllipsis and (not Focused)消息处理程序什么都不做时.

现在我在表单上删除了一个 …

delphi vcl editcontrol

8
推荐指数
1
解决办法
695
查看次数

是否可以确定dbEdit中的文本是否长于可见的文本?

在某些表单上,我有dbEdits,有时不够宽,无法显示其字段可能包含的所有文本.对于他们我有以下代码:

procedure Tgm12edLots.dbeLotNameMouseEnter(Sender: TObject);
begin
  with dbeLotName do begin
    ShowHint := True;
    Hint := Text;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我想避免提示显示所有文本是否可见,但我不知道如何测试该条件.

感谢您的任何提示/建议!

delphi user-interface editcontrol delphi-xe2

7
推荐指数
2
解决办法
875
查看次数

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

在此输入图像描述我一直在尝试找到一个简单的解决方案来更改具有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;
Run Code Online (Sandbox Code Playgroud)

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

c++ winapi background-color editcontrol

6
推荐指数
1
解决办法
3705
查看次数

为什么我的编辑控件在我的win32 c ++应用程序中看起来很奇怪而不使用MFC?

我有这个程序,我创建了一个窗口,在里面,我添加了一个使用普通C(没有MFC或对话框)的编辑控件,编辑控件创建代码是

hWnd=::CreateWindowExA(NULL,      //no extended style
                     "EDIT",     
                      NULL,           //no title       
                      WS_CHILD|WS_VISIBLE|WS_BORDER,      
                      x,          
                      y,        
                      Width,      
                      Height,    
                      hWndParent,
                      (HMENU)id,
                      (HINSTANCE) GetWindowLong(hWndParent, GWL_HINSTANCE),//the module instance
                      NULL);
Run Code Online (Sandbox Code Playgroud)

但渲染的控件看起来很难看......

在此输入图像描述


这就是我希望我的控件看起来像......

酷vista主题编辑控件

我试着打电话InitCommonControlsEx和包括comctl32.lib但没有改变.
我想添加一个描述所有依赖项的应用程序清单文件可以解决问题,但我不知道如何使用Visual Studio 1010 IDE(我自己无法编辑清单文件)

是否有可能只使用c/c ++(没有MFC或.NET之类的东西)来获得正常的vista样式控件.如果添加清单资源可以解决问题,那么我如何编写/生成一个清单文件并将其添加到我的exe?

#include<Windows.h>
#include <commctrl.h >
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(lib,"comctl32.lib")

HWND hwndEdit;
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp)
{
switch(uMsg)
{
case WM_CREATE:
    hwndEdit = CreateWindow( 
            "EDIT",     /* predefined class                  */ 
            NULL,       /* no window title                   */ 
            WS_CHILD | WS_VISIBLE | …
Run Code Online (Sandbox Code Playgroud)

c++ winapi appearance editcontrol

5
推荐指数
2
解决办法
7136
查看次数

Delphi XE8:TEdit TextHint在接收焦点时消失

基本上,我希望我的TEdits的TextHint在输入第一个字符时消失,而不是在它们获得焦点时消失,如此Microsoft页面上的编辑:登录到您的Microsoft帐户.有人可以告诉我如何实现这一目标吗?

先感谢您.

delphi focus editcontrol delphi-xe8

5
推荐指数
2
解决办法
1054
查看次数

如何在Windows CE下的单行EDIT控件上按ENTER键时关闭蜂鸣声?

我正在使用C++和本机WINAPI(即没有MFC等)开发针对POCKET PC 2003(Windows CE 4.2)设备的应用程序.在其中我有一个单行编辑控件,它是主窗口的一部分(不是对话框); 因此,按ENTER键时Windows的正常行为是除了蜂鸣声之外什么也不做.

我已经将编辑控件的窗口过程子类化为使用以下代码覆盖默认行为:


LRESULT CALLBACK Gui::ItemIdInputProc( HWND hwnd, UINT message, WPARAM wParam,
    LPARAM lParam ) {

    switch ( message ) {
        case WM_KEYDOWN :
            switch ( wParam ) {
                case VK_RETURN :
                    addNewItem();
                    return 0;
            }
    }

    return CallWindowProc( oldItemIdInputProc_, hwnd, message, wParam, lParam );
}
Run Code Online (Sandbox Code Playgroud)

这会导致与按下"确定"按钮等效的行为.

现在解决手头的问题:这个窗口过程不会覆盖发出蜂鸣声的默认行为.我怀疑必须有一些其他消息或消息在按下ENTER时触发,我无法捕获; 我只是想不通哪个.我真的想要阻止设备发出哔哔声,因为它会混淆在某些情况下发生项目碰撞时播放的其他声音,并且至关重要的是用户会收到警报.

提前致谢.

c++ winapi editcontrol subclassing

4
推荐指数
1
解决办法
3881
查看次数

如何在编辑控件中偏移光标的位置?

我正在构建一个自定义编辑控件,它包括在左侧添加一个图标和在右侧添加一个图标按钮,两者都在编辑控件内.这需要将文本(和光标)的起点向右移动X个像素量.这也意味着我需要"限制"文本的绘制范围,以便为右侧的按钮腾出空间.目的是在左侧提供自定义图标,例如在浏览器中,以及在右侧提供"X"按钮以清除编辑控件的内容.

如何抵消RectTCustomEdit后代中绘制文本和光标的位置?

delphi drawing custom-controls editcontrol

4
推荐指数
1
解决办法
1173
查看次数

取消对可输入 Win32 Edit 控件的字符数的限制

我到处搜索过,似乎找不到解决这个问题的方法。

我的问题不是限制可以输入编辑控件的字符数量,我的问题是我受到编辑控件的大小的限制。我希望能够输入超过编辑控件大小的内容。

我尝试使用 SendMessage 将字符限制扩展到较高的数字并发送 EM_LIMITTEXT,但这似乎只有在我想进一步限制它时才有效。

这是我的问题的图像示例:

我的问题

我使用 CreateWindowEx 创建编辑控件,但似乎没有扩展窗口样式或编辑控件样式可以实现我想要的。

c++ winapi character-limit editcontrol

4
推荐指数
1
解决办法
2197
查看次数