标签: visual-styles

在C + Win API中编程:如何让Windows 7寻找控件?

我严格使用C和WinAPI编程,没有C++或C#编程.我是一个初学者,只是学习绘制控件等.当我创建Windows或其他控件如命令按钮时,它们具有Windows Native外观.看看这个:

这是我得到的样子!

但在Windows 7中,命令按钮如下所示:

在此输入图像描述

现在,我如何让我的程序中的命令按钮看起来像这样.它甚至可能吗?我正在关注本教程,以供参考:http://zetcode.com/gui/winapi/

谢谢.

c windows winapi button visual-styles

29
推荐指数
3
解决办法
1万
查看次数

使用VisualStyles控件的边框颜色

微软为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)

是否有正确的视觉边框颜色或视觉元素使用的建议?

.net c# windows winforms visual-styles

13
推荐指数
1
解决办法
5858
查看次数

如何在没有清单的情况下启用视觉样式

根据文件:

"如果您希望应用程序使用ComCtl32.dll版本6,则必须添加应用程序清单或编译器指令,以指定如果版本6可用,则应使用该版本."

注意上面的逻辑OR?那么这个神秘的编译器指令是什么?

我有一个原生的Win32 C++应用程序,它完全包含在一个.cpp文件中.没有资源文件,清单文件等.我想保持这种方式,但我也想使用视觉样式.

c++ winapi comctl32 visual-styles

11
推荐指数
3
解决办法
1万
查看次数

TSaveDialog失败,客户端视觉样式被禁用

我想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.

但这非常糟糕,因为它仅适用于在应用程序中禁用视觉样式的人:

  • 对话框继续在没有视觉样式的操作系统上工作(例如Windows Server 2008 R2)
  • 关闭视觉样式后对话框继续工作(例如关闭视觉样式的Windows 7)

这意味着我不能简单地使用IsAppThemed,因为如果 …

delphi themes visual-styles delphi-xe6

7
推荐指数
1
解决办法
305
查看次数

TabRenderer没有启用视觉样式?

我想TabControl用自定义功能绘制自定义.

为此,我继承了Panel类并重写了OnPaint方法以使用TabRenderer类进行绘制.

问题是TabRenderer只有在启用视觉样式(可以检查TabRenderer.IsSupported)时才能工作,但如果禁用了视觉样式,我该怎么办?

在这种情况下,我想使用ControlPaint类来绘制没有视觉样式的选项卡,但它没有与Tabs相关的绘制方法.我希望它基本上像常规一样在视觉上表现TabControl.

.net c# winforms visual-styles

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

视觉风格独立绘图

使用 C# winforms,我想创建看起来像真实控件的自定义控件。

有很多类可用于绘制看起来像真实控件的控件:ControlPaint, VisualStyleRenderer, ButtonRenderer, CheckBoxRenderer, ComboBoxRenderer, GroupBoxRenderer, ProgressBarRenderer, RadioButtonRenderer, ScrollBarRenderer, TabRenderer, TextBoxRenderer, TextRenderer, ToolStripProfessionalRenderer, ToolStripRenderer, ToolStripSystemRenderer, TrackBarRenderer

考虑视觉风格时出现的问题:我想独立于视觉风格。含义:我不在乎用户是否允许视觉样式,我希望它起作用。如果用户启用了视觉样式,我想使用视觉样式绘制它,否则我想在没有视觉样式的情况下绘制它。

根据 MSDN 文档,唯一与视觉样式无关的类是ButtonRendererCheckBoxRendererGroupBoxRendererRadioButtonRenderer。这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式并使用不同的代码来绘制部件。

假设我想自己绘制一个 Tab 控件部件。TabRenderer类具有所有需要的功能,但它只有在用户启用视觉样式时才有效。否则我需要使用ControlPaint类来绘制,但它使用完全不同的模型,没有ControlPaint.DrawTab()方法或类似的东西,我需要弄清楚我需要绘制哪些矩形类型,以便它看起来像一个真正的标签。这很烦人。

包括 Tab 控件在内的内置控件已经具有这种功能,可以使用或不使用视觉样式来绘制自己。为什么微软不向自定义控件创建者公开这个功能?为什么自定义控件创建者应该受苦?

c# drawing winforms visual-styles

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

如何使用.NET TextBoxRenderer与TextBoxState.Hot绘制热文本框?

我试图用来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

winforms visual-styles

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

调整窗口大小时,常用控件未正确绘制

介绍:

我正在创建带有子对话框作为页面的选项卡控件.

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++ winapi tabs visual-styles common-controls

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

Win32的.在dll中启用视觉样式

我没有使用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类型的签名.

c++ dll winapi visual-styles activation-context-api

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

如何更改Win32 API应用程序中的控件主题?

如果我在Win32 API中创建一个按钮,默认的conrol主题看起来像Windows 95/98按钮.我记得过去微软论坛告诉我如何获得XP风格,但我不记得如何做到这一点.有没有办法以编程方式或手动更改Win32应用程序中的控件主题?谢谢.

c c++ api winapi visual-styles

3
推荐指数
1
解决办法
5177
查看次数

TextRenderer.如何用dollipsis渲染文本多行?

我如何渲染这样的文本(简单列表视图)?

默认的ListView渲染

尝试这样的代码不会产生省略号:

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然后文本变成单行.

它可以手动热跟踪项目,同时拖放它们.

c# winforms visual-styles

3
推荐指数
1
解决办法
2218
查看次数

Windows 资源管理器悬停和选择的视觉样式

Windows 的最后三个版本在 Windows 资源管理器列表视图中都具有半透明突出显示和悬停效果:

在此处输入图片说明

使用主题浏览器,我看到 ListItem 没有与我在 Windows 中看到的状态相匹配的状态:

在此处输入图片说明

有没有:

  • 班级
  • 部分
  • 状态

代表Windows中的ListView?

winapi themes visual-styles

3
推荐指数
1
解决办法
358
查看次数

Win32 Visual Styles向后兼容性?

当我在我的程序中嵌入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他们是否运行支持视觉样式的版本?如果是这样,我应该在预处理器中检查哪个版本号.我想知道的另一件事是,没有视觉风格,我可以运行程序的最低版本是什么?

winapi platform operating-system version visual-styles

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