我严格使用C和WinAPI编程,没有C++或C#编程.我是一个初学者,只是学习绘制控件等.当我创建Windows或其他控件如命令按钮时,它们具有Windows Native外观.看看这个:
但在Windows 7中,命令按钮如下所示:
现在,我如何让我的程序中的命令按钮看起来像这样.它甚至可能吗?我正在关注本教程,以供参考:http://zetcode.com/gui/winapi/
谢谢.
微软为winforms提供的视觉风格总是让我迷惑不解.
我试图Panel
坐在旁边TreeView
,只是有相同的VisualStyle边框.
正如你所看到的,TreeView
边框不同于我的绘图尝试Panel
.面板的BorderStyle设置为None.
我试过这个:
Rectangle r = new Rectangle(0, 0, panel1.ClientRectangle.Width - 1, panel1.ClientRectangle.Height - 1);
using (Pen p = new Pen(VisualStyleInformation.TextControlBorder))
e.Graphics.DrawRectangle(p, r);
Run Code Online (Sandbox Code Playgroud)
我试过这个:
VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.TextBox.TextEdit.Normal);
renderer.DrawEdge(e.Graphics, panel1.ClientRectangle,
Edges.Bottom | Edges.Left | Edges.Right | Edges.Top,
EdgeStyle.Sunken, EdgeEffects.Flat);
Run Code Online (Sandbox Code Playgroud)
是否有正确的视觉边框颜色或视觉元素使用的建议?
根据文件:
"如果您希望应用程序使用ComCtl32.dll版本6,则必须添加应用程序清单或编译器指令,以指定如果版本6可用,则应使用该版本."
注意上面的逻辑OR?那么这个神秘的编译器指令是什么?
我有一个原生的Win32 C++应用程序,它完全包含在一个.cpp文件中.没有资源文件,清单文件等.我想保持这种方式,但我也想使用视觉样式.
我想TSaveDialog
在Delphi XE6中使用a :
if not SaveDialog1.Execute(0) then
Exit;
Run Code Online (Sandbox Code Playgroud)
该调用立即返回false,而不显示任何对话框.我将其追溯到创建shell Save Dialog COM对象的行为:
function TCustomFileSaveDialog.CreateFileDialog: IFileDialog;
var
LGuid: TGUID;
begin
LGuid := CLSID_FileSaveDialog;
CoCreateInstance(LGuid, nil, CLSCTX_INPROC_SERVER,
StringToGUID(SID_IFileSaveDialog), Result);
end;
Run Code Online (Sandbox Code Playgroud)
呼叫CoCreateInstance
失败了.我创建了最少的代码来重现问题:
procedure TForm1.Button1Click(Sender: TObject);
const
CLSID_FileSaveDialog: TGUID = '{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}';
begin
CreateComObject(CLSID_FileSaveDialog);
end;
Run Code Online (Sandbox Code Playgroud)
它抛出EOleSysError异常:
0x80040111:ClassFactory无法提供请求的类,ClassID:{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}
我的应用程序是使用公共控件库(6.0.7601.18837)的第6版,但我意识到,如果用户已禁用我的应用程序的视觉样式时才会发生:
我们仍在使用公共控件库的第6版,只IsAppThemed
返回false.
注意:我知道很多人错误地认为:
- Visual Styles API仅在我们加载了Comctrl32.dll版本6时才有效
- 如果加载了Comctrl32.dll的版本6,则Visual Styles API将起作用
- 如果我们不使用ComCtrl v6那么这意味着视觉样式被禁用
- 如果我们使用旧的公共控件库,则禁用视觉样式
蛮力解决方案是将全局UseLatestCommonDialogs设置为false.
但这非常糟糕,因为它仅适用于在应用程序中禁用视觉样式的人:
这意味着我不能简单地使用IsAppThemed
,因为如果 …
我想TabControl
用自定义功能绘制自定义.
为此,我继承了Panel类并重写了OnPaint方法以使用TabRenderer
类进行绘制.
问题是TabRenderer
只有在启用视觉样式(可以检查TabRenderer.IsSupported
)时才能工作,但如果禁用了视觉样式,我该怎么办?
在这种情况下,我想使用ControlPaint
类来绘制没有视觉样式的选项卡,但它没有与Tabs相关的绘制方法.我希望它基本上像常规一样在视觉上表现TabControl
.
使用 C# winforms,我想创建看起来像真实控件的自定义控件。
有很多类可用于绘制看起来像真实控件的控件:ControlPaint
, VisualStyleRenderer
, ButtonRenderer
, CheckBoxRenderer
, ComboBoxRenderer
, GroupBoxRenderer
, ProgressBarRenderer
, RadioButtonRenderer
, ScrollBarRenderer
, TabRenderer
, TextBoxRenderer
, TextRenderer
, ToolStripProfessionalRenderer
, ToolStripRenderer
, ToolStripSystemRenderer
, TrackBarRenderer
。
考虑视觉风格时出现的问题:我想独立于视觉风格。含义:我不在乎用户是否允许视觉样式,我希望它起作用。如果用户启用了视觉样式,我想使用视觉样式绘制它,否则我想在没有视觉样式的情况下绘制它。
根据 MSDN 文档,唯一与视觉样式无关的类是ButtonRenderer
、CheckBoxRenderer
、GroupBoxRenderer
、RadioButtonRenderer
。这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式并使用不同的代码来绘制部件。
假设我想自己绘制一个 Tab 控件部件。TabRenderer
类具有所有需要的功能,但它只有在用户启用视觉样式时才有效。否则我需要使用ControlPaint
类来绘制,但它使用完全不同的模型,没有ControlPaint.DrawTab()
方法或类似的东西,我需要弄清楚我需要绘制哪些矩形类型,以便它看起来像一个真正的标签。这很烦人。
包括 Tab 控件在内的内置控件已经具有这种功能,可以使用或不使用视觉样式来绘制自己。为什么微软不向自定义控件创建者公开这个功能?为什么自定义控件创建者应该受苦?
我试图用来TextBoxRenderer
呈现一个"热"文本框:
TextBoxRenderer.DrawTextBox(e.Graphics, rectangle, TextBoxState.Hot);
Run Code Online (Sandbox Code Playgroud)
除了它不起作用,它不会使文本框变为热.
TextBoxState.Selected
不会呈现为选中状态TextBoxState.Hot
不会变得很热我如何TextBoxRenderer.DrawTextBox(..., Hot)
渲染为Hot
?
我如何TextBoxRenderer.DrawTextBox(..., Selected)
渲染为Selected
?
我正在创建带有子对话框作为页面的选项卡控件.
我Visual Styles
通过#pragma
评论启用了.我也呼吁InitCommonControlsEx
,并#pragma comment( lib, "comctl32.lib" )
为好.
最初,当窗口加载,对话框及其常用控件具有适当的背景时,请参见下图:
在调整大小期间,事情并不那么一致 - >背景开始明显不匹配.我将在下面提供截图:
你可以清楚地看到checkbox
并且static control
有不正确的背景,而在我看来dialog box
(创建充当儿童控制)具有适当的背景.
2014年11月24日编辑:
封闭控件后group boxes
,似乎没有绘画问题.我的显示器是旧的CRT(三星SyncMaster 753s),我的视力不好,但同样,似乎一切都画得很好.窗口仍然在调整大小时可怕地闪烁,但我已经尝试了一切能力来修复它.
我怎样才能解决这个问题?
我还没有找到任何东西,但我在输入这个问题时仍然是Goggling ...
以下是创建说明问题的演示的说明:
1.)创建空C++
项目Visual Studio
;
2.)添加头文件,命名pomocne_funkcije.h
并复制/粘贴以下内容:
#include <windows.h>
#include <windowsx.h>
#include <comutil.h>
#include <commctrl.h>
#include <stdio.h>
#include <vector>
#include <ole2.h>
#include <string>
#include <stdlib.h>
#include <locale.h>
#include <Uxtheme.h>
#pragma comment( linker, "/manifestdependency:\"type='win32' \ …
Run Code Online (Sandbox Code Playgroud) 我没有使用C++和Win API的经验,很抱歉,如果这个问题没有问题.例如,我有DLL创建一些组件MessageBox
.我添加了pragma注释以启用视觉样式并且它不起作用(它应该不是我从这个答案中知道的:在Internet Explorer工具栏上的组合框的Windows 7样式,怎么样?
DLL代码(省略导出等):
#include "stdafx.h"
#include "my-dll.h"
#include <Windows.h>
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
MYDLL_API int fnmydll(void)
{
MessageBox(NULL, L"Message", NULL, 0);
return 42;
}
Run Code Online (Sandbox Code Playgroud)
然后我从我的应用程序调用此dll函数:
#include <iostream>
#include <Windows.h>
#include "my-dll.h"
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
fnmydll();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而且我的消息框却没有视觉风格.据我所知,我应该在调用我的dll时激活上下文,但MSDN没有示例如何做到这一点.你能不能给我这样的例子或者至少解释一下更多细节?因为我甚BOOL GetCurrentActCtx(_Out_ HANDLE *lphActCtx);
至无法理解为什么函数接收指针ACTCTX
但具有某种HANDLE
类型的签名.
如果我在Win32 API中创建一个按钮,默认的conrol主题看起来像Windows 95/98按钮.我记得过去微软论坛告诉我如何获得XP风格,但我不记得如何做到这一点.有没有办法以编程方式或手动更改Win32应用程序中的控件主题?谢谢.
我如何渲染这样的文本(简单列表视图)?
尝试这样的代码不会产生省略号:
TextRenderer.DrawText(_listGraphics,
anItem.Text, GetItemFont(anItem),
textRec,
Color.FromKnownColor(KnownColor.ControlText),
TextFormatFlags.Top| TextFormatFlags.EndEllipsis|
TextFormatFlags.WordBreak | TextFormatFlags.HorizontalCenter);
Run Code Online (Sandbox Code Playgroud)
如果我删除TextFormatFlags.WordBreak
然后文本变成单行.
它可以手动热跟踪项目,同时拖放它们.
Windows 的最后三个版本在 Windows 资源管理器列表视图中都具有半透明突出显示和悬停效果:
使用主题浏览器,我看到 ListItem 没有与我在 Windows 中看到的状态相匹配的状态:
有没有:
代表Windows中的ListView?
当我在我的程序中嵌入Visual Styles清单时,如下所示:
// Embed visual style XML manifest
#pragma comment(linker, \
"\"/manifestdependency:type='Win32'" \
" name='Microsoft.Windows.Common-Controls'" \
" version='6.0.0.0'" \
" processorArchitecture='*'" \
" publicKeyToken='6595b64144ccf1df'" \
" language='*'\"" \
)
// Link common controls library
#pragma comment(lib, "ComCtl32.lib")
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的程序只能在Windows XP上运行?或者,如果计算机上没有视觉样式,他们只会使用操作系统默认样式吗?我问,因为我在我的程序中启用了Visual Studio 2008开发的视觉样式,我想知道它可以运行的最早版本的Windows是什么.我应该检查WINVER
他们是否运行支持视觉样式的版本?如果是这样,我应该在预处理器中检查哪个版本号.我想知道的另一件事是,没有视觉风格,我可以运行程序的最低版本是什么?