请问运行时的大小控制框是怎么做的?就象画笔中的一样?需要API实现方法,不要用VCL。 (200分)

  • 主题发起人 主题发起人 hlsl
  • 开始时间 开始时间
H

hlsl

Unregistered / Unconfirmed
GUEST, unregistred user!
请打开画笔,然后打开一个图形文件。<br>用“选定”选中一部分图象,这个时候选中的图象周围有一个虚框,以及8个小方块(就象VC和DELPHI中编辑控件时的状态)。这个虚框可以通过小方块改变大小,改<br>变大小的时候是虚线,直到鼠标放开才改变大小。同时,这个虚框也可以用鼠标移动。(注意!和后者不同)<br><br>请再看整幅图象的边缘,也有一个虚框,这个虚框和上面的那个基本一样,但是不能用鼠标移动。<br><br>我在很多软件上也看到过这种效果,也用DELPHI写过在VCL环境下类似的功能(VCL下的原理是创建一个透明的窗口覆盖在原来的部分上面);<br><br>我肯定画笔不是用DELPHI开发的(废话),所以想请问这个功能用API是如何实现的?难道和DELPHI下的一样?<br><br>简单的劝我自己手画的、只是来说闲话的、回答不能详尽的请不要回帖,我还有机会取消帖子。
 
用几百句api加上各种数据结构实现的
 
请各位多多发言。<br>我目前还是很想知道这个问题的解决方法。<br>又一个方法是创建一个透明窗体,大小和么控制的对象是一样的。<br>然后所有操作(移动,改变大小)都是在这个透明窗体上进行。然后有这个透明窗体来同步被控制对象。<br>这个方法哦哦已经实现了,不过效果不是很好。<br>不知道还有什么其他的方法或者对这个方法的改进方案?
 
用canvas也可以的,但是要Xor一下,以前做过的,很简单!但是代码我找不到了我也在找![:D]<br>其实不是窗口覆盖的做法,而是画虚线然后.....后来一个做游戏的人给了我你需要那样功能的代码,很独特<br>哈哈,还请后面答复的人提醒
 
这个方法是一个解决方案,不过,不知道如何判断鼠标是否在边框的虚线上呢?<br>不会是自己手动写一堆 IF THEN ELSE 判断吧?<br><br>另外,这个方法如果用在控件的运行期操作的时候,如何屏蔽控件原来的相关事件呢?<br>例如,我们都不希望在运行期设计的时候,选择按钮的时候触发了按钮的单击事件吧?<br>虽然,我们可以通过之前取消控件的事件,设计之后恢复的方法来实现这一点,但是不<br>知道是否有更通用一点的方法?<br><br>还有,你提到的代码是否能够给我参考一下?用什么语言写的无所谓,我想看一下原理。
 
代码很少,但是可能你们看不大懂,呵呵,其实我也不怎么懂。应该是看的莫名其妙吧[:D]<br>代码在家,我现在在公司,我晚上贴上来!<br>这种图形的东西,最好多认识几个做游戏的人就会很清楚了![:D]<br>还有,我觉得这样的功能和控件的DrawKind属性差不多!你可以看看系统的写法!<br>屏蔽事件更简单了,原始的不继承不就可以了!
 
看了觉得好一定要给我加分啊!<br>//////////////////////////////////////////////////////////////////////<br>//兩個控件對齊需要的偏移量=GetSystemMetrics(SM_CYSIZEFRAME)-1<br>//x/y方向相同,即FillPanel1.x = DragPanel1.x + GetSystemMetrics(SM_CYSIZEFRAME)-1<br><br>unit cDragPanel;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; ExtCtrls;<br><br>type<br>&nbsp; TDragPanel = class(TPanel)<br>&nbsp; private<br>&nbsp; &nbsp; xCount,yCount : Integer;<br>&nbsp; &nbsp; FFontSize : Integer;<br>&nbsp; &nbsp; procedure CreateParams(var Params: TCreateParams); override;<br>&nbsp; &nbsp; procedure CalcFrameSize;<br>&nbsp; protected<br>&nbsp; &nbsp; procedure WMSize(var Message: TWMSize); message WM_Size;<br>&nbsp; &nbsp; Procedure Paint; override; {Drawing the panel}<br>&nbsp; public<br>&nbsp; &nbsp; constructor Create(AOwner: TComponent); override;<br>&nbsp; &nbsp; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;<br>&nbsp; &nbsp; procedure SetFontSize(FontSize : Integer);<br>&nbsp; published<br>&nbsp; &nbsp; { Published declarations }<br>&nbsp; end;<br><br>&nbsp; TFillPanel = class(TPanel)<br>&nbsp; private<br>&nbsp; &nbsp; xCount,yCount : Integer;<br>&nbsp; &nbsp; FFontSize : Integer;<br>&nbsp; &nbsp; procedure CalcFrameSize;<br>&nbsp; protected<br>&nbsp; &nbsp; procedure WMSize(var Message: TWMSize); message WM_Size;<br>&nbsp; &nbsp; Procedure Paint; override; {Drawing the panel}<br>&nbsp; public<br>&nbsp; &nbsp; constructor Create(AOwner: TComponent); override;<br>&nbsp; &nbsp; procedure SetFontSize(FontSize : Integer);<br>&nbsp; published<br>&nbsp; &nbsp; { Published declarations }<br>&nbsp; end;<br><br>procedure Register;<br><br>implementation<br><br><br>procedure Register;<br>begin<br>&nbsp; RegisterComponents('ABMCTRL', [TDragPanel]);<br>&nbsp; RegisterComponents('ABMCTRL', [TFillPanel]);<br>end;<br><br>procedure TDragPanel.CalcFrameSize;<br>begin<br>&nbsp; xCount := (ClientWidth-2) div FFontSize;<br>&nbsp; yCount := (ClientHeight-2) div FFontSize;<br>&nbsp; ClientWidth := ClientWidth - (ClientWidth-2) mod FFontSize;<br>&nbsp; ClientHeight := ClientHeight - (ClientHeight-2) mod FFontSize;<br>end;<br><br>constructor TDragPanel.Create(AOwner: TComponent);<br>begin<br>&nbsp; inherited;<br>&nbsp; xCount := 0;<br>&nbsp; yCount := 0;<br>&nbsp; Font.Size := 9;<br>&nbsp; Canvas.Font.Size := 9;<br>&nbsp; FFontSize := -Canvas.Font.Height;<br>end;<br><br>procedure TDragPanel.CreateParams;<br>begin<br>&nbsp; inherited CreateParams(Params);<br>&nbsp; with Params do Style := Style or WS_SIZEBOX ; { enable resize }<br>end;<br><br>procedure TDragPanel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);<br>begin<br>&nbsp; inherited;<br>&nbsp; ReleaseCapture;<br>&nbsp; perform(WM_SysCommand, SC_MOVE or 2, 0); { enable move }<br>end;<br><br>procedure TDragPanel.Paint;<br>var<br>&nbsp; R &nbsp; : TRect;<br>&nbsp; i,j : Integer;<br>begin<br>&nbsp; inherited;<br><br>&nbsp; R := GetClientRect;<br>&nbsp; with Canvas do<br>&nbsp; begin<br>&nbsp; &nbsp; { fill background }<br>&nbsp; &nbsp; Brush.Color := clWhite;<br>&nbsp; &nbsp; FillRect(R);<br><br>&nbsp; &nbsp; For i:= 0 to yCount-1 do<br>&nbsp; &nbsp; &nbsp; For j:=0 to xCount-1 do<br>&nbsp; &nbsp; &nbsp; &nbsp; TextOut(1+j*FFontSize,1+i*FFontSize,'汉');<br><br>&nbsp; &nbsp; Brush.Color := clBlack;<br>&nbsp; &nbsp; FrameRect(R);<br>&nbsp; end;<br>end;<br><br>procedure TDragPanel.SetFontSize(FontSize: Integer);<br>begin<br>&nbsp; FFontSize := FontSize;<br>&nbsp; CalcFrameSize;<br>&nbsp; Invalidate;<br>end;<br><br>procedure TDragPanel.WMSize(var Message: TWMSize);<br>begin<br>&nbsp; inherited;<br>&nbsp; CalcFrameSize;<br>end;<br><br>{ TFillPanel }<br><br>procedure TFillPanel.CalcFrameSize;<br>begin<br>&nbsp; xCount := (ClientWidth-2) div FFontSize;<br>&nbsp; yCount := (ClientHeight-2) div FFontSize;<br>&nbsp; ClientWidth := ClientWidth - (ClientWidth-2) mod FFontSize;<br>&nbsp; ClientHeight := ClientHeight - (ClientHeight-2) mod FFontSize;<br>end;<br><br>constructor TFillPanel.Create(AOwner: TComponent);<br>begin<br>&nbsp; inherited;<br>&nbsp; xCount := 0;<br>&nbsp; yCount := 0;<br>&nbsp; Font.Size := 9;<br>&nbsp; Canvas.Font.Size := 9;<br>&nbsp; FFontSize := -Canvas.Font.Height;<br>end;<br><br>procedure TFillPanel.Paint;<br>var<br>&nbsp; R &nbsp; : TRect;<br>&nbsp; i,j : Integer;<br>begin<br>&nbsp; inherited;<br><br>&nbsp; R := GetClientRect;<br>&nbsp; with Canvas do<br>&nbsp; begin<br>&nbsp; &nbsp; { fill background }<br>&nbsp; &nbsp; Brush.Color := clWhite;<br>&nbsp; &nbsp; FillRect(R);<br><br>&nbsp; &nbsp; For i:= 0 to yCount-1 do<br>&nbsp; &nbsp; &nbsp; For j:=0 to xCount-1 do<br>&nbsp; &nbsp; &nbsp; &nbsp; TextOut(1+j*FFontSize,1+i*FFontSize,'汉');<br><br>&nbsp; &nbsp; Brush.Color := clBlack;<br>&nbsp; &nbsp; FrameRect(R);<br>&nbsp; end;<br>end;<br><br>procedure TFillPanel.SetFontSize(FontSize: Integer);<br>begin<br>&nbsp; FFontSize := FontSize;<br>&nbsp; CalcFrameSize;<br>&nbsp; Invalidate;<br>end;<br><br>procedure TFillPanel.WMSize(var Message: TWMSize);<br>begin<br>&nbsp; inherited;<br>&nbsp; CalcFrameSize;<br>end;<br><br>end.
 
记得 VC 里面用专门的接口实现。
 
to rockjie:<br>&nbsp; 老实说,这个方法对我来说并不是很好。<br><br>to jsxjd:<br>&nbsp; 还记得是哪个接口吗?
 
我找过VS2003/VS2003的 VC ,里面没有这个例子啊。我的朋友也说好象记得VC有这个例子的,帮我找一下如何?我找不到。。。。
 
关注。。。<br>这个问题的时间跨度真大呀^_^
 
呵呵,不好意思,拖了这么久还没有结.主要是因为我还没有找到一个满意的答案。如果还是没有的话,就结了.
 
快结吧,这问题是有难度
 
啊,我知道有难度啊,否则两年时间怎么也弄出来了。谁能告诉我VC里面的例子在哪儿?我怎么也没找到,是否是版本不对?哪个版本里面有啊?
 
给你delphi的代码还不够啊!结了算了,用vc做的话还要做成activex呢
 
晕,这贴两年还没结啊?<br>http://www.torry.net/vcl/graphics/other/trectbox.zip<br>这个例子应该能实现大致功能,但需要修改修改。
 
:++ 我也觉得有点夸张了。。。。<br><br>结了
 
后退
顶部