我试图在带有滚动条的自定义控件的客户区周围绘制彩色边框.为此,我设置BorderWidth为正整数并响应该WM_NCPAINT消息.这听起来像混合VCL和Win32,但该BorderWidth属性只是导致对WM_NCCALCSIZE消息的适当处理.
以下代码是SSCCE:
unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TSample = class(TCustomControl)
protected
procedure Paint; override;
procedure CreateParams(var Params: TCreateParams); override;
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
published
property BorderWidth;
end;
TForm6 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form6: TForm6;
implementation
{$R *.dfm}
{ TSample }
procedure TSample.CreateParams(var Params: TCreateParams);
begin
inherited; …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个窗口,WM_NCPAINT根据用户设置在具有Aero/Glass和自定义渲染帧(通过处理)之间切换.(Windows Vista).
DwmComposition已启用.我的应用程序提供了玻璃框架,但是一旦我切换设置以触发自定义WM_NCPAINT代码路径然后切换回使用DefWindowProc的WM_NCPAINT处理,原生框架现在永远停留在"Vista Basic"风格 - 它不再是半透明的标题按钮与普通的Aero/Glass按钮看起来不同.
我已经尝试了各种方法,从发送SWP_FRAMECHANGED到更改窗口样式,然后将其更改回来,隐藏它等等,但是一切都无济于事.似乎只要我处理WM_NCPAINT一个玻璃窗而不是推迟到DefWindowProc我的窗户就会永远"破碎".
我在MSDN上找到了一个C#/ WPF示例(代码点msdn dot microsoft dot com slash chrome),似乎表明只需要停止处理WM_NCPAINT并且玻璃会返回,但这似乎不适用于我自己的应用程序.
有没有办法干净地重置这个状态?我的代码是用C++编写的,住在这里:
http://bengoodger.dreamhosters.com/software/chrome/dwm/
#include <windows.h>
#include <dwmapi.h>
static const wchar_t* kWindowClass = L"BrokenGlassWindow";
static const wchar_t* kWindowTitle =
L"BrokenGlass - Right click client area to toggle frame type.";
static const int kGlassBorderSize = 50;
static const int kNonGlassBorderSize = 40;
static bool g_glass = true;
bool IsGlass() {
BOOL composition_enabled = …Run Code Online (Sandbox Code Playgroud) 如何使用aero Like Windows 7在vista的标题栏中绘制文本(使用onClick事件)?
替代文字http://img529.imageshack.us/img529/3643/immaginembl.jpg
delphi.about.com上的示例无法在带有aero的Vista上运行.你有什么想法?
谢谢大家.
对不起,我的英语不好.
在几乎任何Windows应用程序中,我注意到在非客户区域中按住鼠标按钮会导致绘画停止.为什么需要这个?
例如,我有一个Managed Direct 3D应用程序,它显示一个旋转立方体.如果我将指针放在标题栏上并按住鼠标按钮,即使我没有将任何此类条件编码到循环中,立方体也会停止旋转.
为什么画停了?有什么好处?最重要的是,我该如何解决这个问题?
我目前正在通过拦截各种WndProc消息并在非客户区绘制来编写某种自定义表单边框.要为关闭按钮等创建某种悬停效果,我需要跟踪鼠标指针.这很好用,但是要接收WM_NCMOUSELEAVE消息,我必须先调用_TrackMouseEvent,根据MSDN.
令人惊讶的是,它不起作用._TrackMouseEvent失败,Marshal.GetLastWin32Error()返回998(对内存位置的无效访问).
我很无能,所以这是我的代码:
class Native
{
[DllImport("comctl32.dll", SetLastError = true)]
public static extern bool _TrackMouseEvent(TRACKMOUSEEVENT tme);
public struct TRACKMOUSEEVENT
{
public int cbSize;
public int dwFlags;
public IntPtr hwndTrack;
public int dwHowerTime;
}
public const int TME_LEAVE = 0x00000002;
public const int TME_NONCLIENT = 0x00000010;
}
private void ActivateLeaveTracking()
{
Native.TRACKMOUSEEVENT tme = new Native.TRACKMOUSEEVENT();
tme.hwndTrack = this.Handle;
tme.dwHowerTime = 0;
tme.dwFlags = Native.TME_LEAVE | Native.TME_NONCLIENT;
tme.cbSize = Marshal.SizeOf(typeof(Native.TRACKMOUSEEVENT));
if (!Native._TrackMouseEvent(tme))
{ …Run Code Online (Sandbox Code Playgroud)