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

到目前为止,我能够实现跟踪工具提示并在用户进行无效输入时显示它.
但是,工具提示是错误的.我试图使用ScreenToClient并ClientToScreen修复此问题但失败了.
以下是创建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) 我试图在MFC中创建一个搜索编辑控件,它始终在控件窗口中显示一个图标(无论控件的状态和文本如何).我多年前写过类似的东西并且运行得很好,但代码不再适用于Windows 7及更新版本(甚至可能是Vista,但没有尝试过).发生的情况是控件中显示的图像与输入区域重叠(参见下图).
代码背后的想法:
CEdit(在OnPaint中处理绘画)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) 我试图在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)消息处理程序什么都不做时.
现在我在表单上删除了一个 …
在某些表单上,我有dbEdits,有时不够宽,无法显示其字段可能包含的所有文本.对于他们我有以下代码:
procedure Tgm12edLots.dbeLotNameMouseEnter(Sender: TObject);
begin
with dbeLotName do begin
ShowHint := True;
Hint := Text;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我想避免提示显示所有文本是否可见,但我不知道如何测试该条件.
感谢您的任何提示/建议!
我一直在尝试找到一个简单的解决方案来更改具有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(没有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)
但渲染的控件看起来很难看......

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

我试着打电话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) 基本上,我希望我的TEdits的TextHint在输入第一个字符时消失,而不是在它们获得焦点时消失,如此Microsoft页面上的编辑:登录到您的Microsoft帐户.有人可以告诉我如何实现这一目标吗?
先感谢您.
我正在使用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时触发,我无法捕获; 我只是想不通哪个.我真的想要阻止设备发出哔哔声,因为它会混淆在某些情况下发生项目碰撞时播放的其他声音,并且至关重要的是用户会收到警报.
提前致谢.
我正在构建一个自定义编辑控件,它包括在左侧添加一个图标和在右侧添加一个图标按钮,两者都在编辑控件内.这需要将文本(和光标)的起点向右移动X个像素量.这也意味着我需要"限制"文本的绘制范围,以便为右侧的按钮腾出空间.目的是在左侧提供自定义图标,例如在浏览器中,以及在右侧提供"X"按钮以清除编辑控件的内容.
如何抵消Rect在TCustomEdit后代中绘制文本和光标的位置?
我到处搜索过,似乎找不到解决这个问题的方法。
我的问题不是限制可以输入编辑控件的字符数量,我的问题是我受到编辑控件的大小的限制。我希望能够输入超过编辑控件大小的内容。
我尝试使用 SendMessage 将字符限制扩展到较高的数字并发送 EM_LIMITTEXT,但这似乎只有在我想进一步限制它时才有效。
这是我的问题的图像示例:

我使用 CreateWindowEx 创建编辑控件,但似乎没有扩展窗口样式或编辑控件样式可以实现我想要的。
editcontrol ×10
c++ ×6
winapi ×5
delphi ×4
appearance ×1
delphi-xe2 ×1
delphi-xe8 ×1
drawing ×1
focus ×1
mfc ×1
paint ×1
subclassing ×1
tooltip ×1
vcl ×1
visual-c++ ×1