- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试change the background color of a DateTimePicker ,但我的问题与我想做的事情无关。
我正在捕获窗口的 WM_PAINT
消息,让默认的绘图实现发生(即 ComCtrl.dll 中的实现),然后在其上进行绘制。
最初我的代码很简单:
TDateTimePicker = class(Vcl.ComCtrls.TDateTimePicker)
protected
procedure WMPaint(var Message: TMessage); message WM_PAINT;
end;
procedure TDateTimePicker.WMPaint(var Message: TMessage);
begin
inherited;
end;
我什么也没做,控件正常绘制:
现在我将进行一些实际的绘图。这不是我想要的绘图,但它证明了它是有效的。我将在控件的矩形上绘制一个十字:
procedure TDateTimePicker.WMPaint(var Message: TMessage);
var
dc: HDC;
rc: TRect;
p: HPEN;
begin
inherited;
//Get the device context to scribble on
dc := GetDC(Self.Handle);
if dc = 0 then
Exit;
try
rc := Self.GetClientRect;
//Create a pen to draw a criss-cross
p := CreatePen(PS_SOLID, 0, ColorToRGB(clLime));
p := SelectObject(dc, p); //select the pen into the dc
Winapi.Windows.MoveToEx(dc, rc.Left, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Right, rc.Bottom);
Winapi.Windows.MoveToEx(dc, rc.Right, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Left, rc.Bottom);
P := SelectObject(dc, p); //restore old pen
DeleteObject(p); //delete our pen
finally
ReleaseDC(Self.Handle, dc);
end;
end;
这是非常简单的事情:
HDC
而且它有效!
当然有效。
我不想画十字,我想填充背景。首先,我将演示一种使用可怕的、可怕方法来实现我的目标的方法:
I will stroke the width of the control with a very thick pen
这是一件可怕的事情,但它具有实际工作的优点:
procedure TDateTimePicker.WMPaint(var Message: TMessage);
var
dc: HDC;
rc: TRect;
p: HPEN;
begin
inherited;
dc := GetDC(Self.Handle);
if dc = 0 then
Exit;
try
rc := Self.GetClientRect;
//Fill a rectangle using a pen (cause FillRect doesn't work)
p := CreatePen(PS_SOLID, rc.Height, ColorToRGB(clRed));
p := SelectObject(dc, p);
Winapi.Windows.MoveToEx(dc, rc.Left, (rc.Bottom+rc.Top) div 2, nil); //middle of left edge
Winapi.Windows.LineTo(dc, rc.Right, (rc.Bottom+rc.Top) div 2); //middle of right edge
P := SelectObject(dc, p); //restore old pen
DeleteObject(p); //delete our pen
//Create a pen to draw a criss-cross
p := CreatePen(PS_SOLID, 0, ColorToRGB(clLime));
p := SelectObject(dc, p); //select the pen into the dc
Winapi.Windows.MoveToEx(dc, rc.Left, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Right, rc.Bottom);
Winapi.Windows.MoveToEx(dc, rc.Right, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Left, rc.Bottom);
P := SelectObject(dc, p); //restore old pen
DeleteObject(p); //delete our pen
finally
ReleaseDC(Self.Handle, dc);
end;
end;
这是非常简单的事情:
它有效:
当然有效!
我不想删除日期时间选择器中的所有内容,只想删除“客户端”区域。所以我调整了矩形:
带有代码片段:
rc := Self.GetClientRect;
//rc := GetRectOfThePartIWant;
rc.Left := 2;
rc.Top := 2;
rc.Bottom := rc.Bottom-2;
rc.Right := rc.Right-34; //button width is 34 (use DateTime_GetDateTimePickerInfo.rcButton)
//Fill a rectangle using a pen (cause FillRect doesn't work)
//p := CreatePen(PS_SOLID, rc.Height, ColorToRGB(clRed));
br := Default(TLogBrush);
br.lbStyle := BS_SOLID;
br.lbColor := ColorToRGB($00CCCCFF);
br.lbHatch := 0; //ignored for a BS_SOLID brush
p := ExtCreatePen(PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_FLAT, rc.Height, br, 0, nil);
if p <> 0 then
begin
p := SelectObject(dc, p);
Winapi.Windows.MoveToEx(dc, rc.Left, (rc.Bottom+rc.Top) div 2, nil); //middle of left edge
Winapi.Windows.LineTo(dc, rc.Right, (rc.Bottom+rc.Top) div 2); //middle of right edge
P := SelectObject(dc, p); //restore old pen
DeleteObject(p); //delete our pen
end;
它有效:
当然有效!
最初我只是使用了FillRect
,只不过它坚持只用白色绘制;而不是任何颜色:
procedure TDateTimePicker.WMPaint(var Message: TMessage);
var
dc: HDC;
rc: TRect;
br: TLogBrush;
b: HBRUSH;
le: Integer;
p: HPEN;
begin
inherited;
dc := GetDC(Self.Handle);
if dc = 0 then
Exit;
try
rc := Self.GetClientRect;
b := CreateSolidBrush(ColorToRGB(clRed));
if b <> 0 then
begin
b := SelectObject(dc, b); //select the brush into the DC
if b <> 0 then
begin
le := FillRect(dc, rc, b);
if le = 0 then
begin
//Draw failed
if IsDebuggerPresent then
DebugBreak;
end;
SelectObject(dc, b); //restore the old brush
end;
DeleteObject(b);
end;
//Create a pen to draw a criss-cross
p := CreatePen(PS_SOLID, 0, ColorToRGB(clLime));
p := SelectObject(dc, p); //select the pen into the dc
Winapi.Windows.MoveToEx(dc, rc.Left, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Right, rc.Bottom);
Winapi.Windows.MoveToEx(dc, rc.Right, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Left, rc.Bottom);
P := SelectObject(dc, p); //restore old pen
DeleteObject(p); //delete our pen
finally
ReleaseDC(Self.Handle, dc);
end;
end;
它不起作用:
当然不行。它试图让我的生活变得困难。如果它有效的话我就不用花 9 个小时在上面了。
我尝试只填充矩形的上半部分;确保我的来源是正确的:
rc := Self.GetClientRect;
rc2 := rc;
rc2.Bottom := (rc2.Top + rc2.Bottom) div 2;
b := CreateSolidBrush(ColorToRGB(clRed));
if b <> 0 then
begin
b := SelectObject(dc, b); //select the brush into the DC
if b <> 0 then
begin
le := FillRect(dc, rc2, b);
if le = 0 then
begin
//Draw failed
if IsDebuggerPresent then
DebugBreak;
end;
SelectObject(dc, b); //restore the old brush
end;
DeleteObject(b);
end;
//Create a pen to draw a criss-cross
p := CreatePen(PS_SOLID, 0, ColorToRGB(clLime));
p := SelectObject(dc, p); //select the pen into the dc
Winapi.Windows.MoveToEx(dc, rc.Left, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Right, rc.Bottom);
Winapi.Windows.MoveToEx(dc, rc.Right, rc.Top, nil);
Winapi.Windows.LineTo(dc, rc.Left, rc.Bottom);
P := SelectObject(dc, p); //restore old pen
DeleteObject(p); //delete our pen
它不起作用:
当然不行。
为什么不起作用?
您无法使用 Delphi 样式引擎,because the Styles Engine is not enabled when using Windows themes (仅当使用自定义主题时)。
最佳答案
b := CreateSolidBrush(ColorToRGB(clRed));
if b <> 0 then
begin
b := // *** original brush gets overwritten here ***
SelectObject(dc, b); //select the brush into the DC
if b <> 0 then
begin
le := FillRect(dc, rc, b);
您不需要将画笔选择到设备上下文中,因为您将其作为参数传递。然后选择它,将返回的值分配回画笔变量,然后使用错误的画笔参数执行FillRect
(这就是它不起作用的原因)。
关于delphi - 为什么当 LineTo 成功时 FillRect 不绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519335/
我试图根据点'数组中的坐标绘制线条,但当我调用此方法时,它在线条中显示以下错误。当我写例如console.log(points[1][1]) 它向我显示了该元素。有人能指出我在这里想念的东西吗? "U
你好我想用java画线,刷新率为60fps: import javafx.application.Application; import javafx.stage.Stage; import java
我有一个来自Inkscape,Illustrator或任何其他应用程序的SVG文件。我想将形状转换为lineto,moveto,curveto格式。 我想要的是这样的: ./Appname svgfi
我目前正在 Android Studio 上学习 Canvas,我不太确定使用正确的标题,但我一直在研究如何在使用 Seekbar 拖动红点时控制三角形位置。以下是详细信息 下面是我成功绘制三角形的代
我需要随机化形状的坐标。我知道我需要以某种方式介绍 Math.floor(Math.Random * num);在那里排队,但我所做的一切似乎都不起作用。 这是我要随机化的填充了坐标的 block 。
我刚刚开始学习 C++。我想要做的就是画一条线到指定的坐标,它作为方法的输入。我使用 MoveToEx 在每个循环中设置起点(在循环中使用不同的参数调用此函数)并给出我想要绘制车道的坐标。 关于如何使
有人可以帮助我了解 path.lineTo(x,y) 的实际工作原理吗?我正在尝试在手指画类型的应用程序中绘制一条简单的直线。这是我试过的一个例子: mPath.reset()
我正在尝试使用两个for循环绘制网格,一个用于绘制10条垂直线,另一个用于绘制10条水平线。像这样: for(var i=1;i 这确实很奇怪。我测试了你在这里写的所有内容,结果是一样的。现在我拼命打
我是 JavaScript 新手! 如何将变量分配给当前的 xy 坐标,以便我可以使用相对位置来绘制线条?尝试用键盘进行 eclipse 刻草图。上、下、左、右箭头键...使用 JS、CSS 和 HT
假设我有以下 JavaScript 代码: var canvas = document.getElementById('myCanvas'); var ctx = canvas.getContext(
function TrackGraphic(model, canvas) { //TrackModel this._model = model; this.draw = fun
这种情况不好解释,我用一张图来说明: 创建的第一个形状内的像素变亮。用黑色清除屏幕,绘制红色和绿色框,然后绘制路径。到目前为止,我发现的唯一修复方法是将框的线宽设置为 2 像素,原因已概述 here
有没有办法为 TCanvas.LineTo 方法设置 lineends 的样式?它似乎默认为圆角末端,当 Pen.Width 设置为较大值(例如 9)时,对于不同颜色的一行中的多条线来说,这看起来非常
我尝试使用 HTML5 Canvas 制作动画,在其中绘制 3 个片段的位置,每个片段用一个圆圈连接起来。 每个圆的位置由 (x1,y1)、(x2,y2) 和 (x3,y3) 确定。 这是我的代码片段
我正在一个单独的项目中,试图从炮塔到敌人画一条线。但是我希望这条线保持在炮塔边界之内,而不是一直延伸到敌人。我在下面的代码段中找到了一个较小的示例。 请彻底回答,因为我绝对不是专家。非常感谢!谢谢。
我一直在查看 Emanuele Feronato 的字符串避免器代码(下面的代码和链接)并尝试对其进行调整,以便当字符串与自身相交时 - 形成一个闭环 - 它只填充该区域 see image .我的数
我目前正在尝试在我的 Canvas speechbubble 元素下绘制一个箭头。 我的问题: 箭头的右侧似乎比左侧长得多。 我尝试了什么: 我尝试通过以下方式创建箭头: ctx.moveTo(x,
我创建了一个扩展 Shape 的类,以便为我的按钮背景绘制自定义形状(带切角的矩形)。我遇到的问题是画成对角线的线看起来比直线粗得多: 如何使边框始终保持一致的宽度?我尝试将抗锯齿设置为 true/f
主题说明了一切:您可以将负数传递给 HMTL5 Canvas 中的绘图基元吗? 例如,如果我转换为 (100,100),我可以使用坐标 (-25,-25) 绘制一个矩形或直线吗?使用 lineTo 进
我有一个简单的 Canvas 绘图应用程序。 有时 lineTo() 命令会生成一条坐标较少的线,并且绘图有很多边: 我正在使用最新的 firefox,是因为连接不好还是我的电脑很忙?有解决办法吗?这
我是一名优秀的程序员,十分优秀!