📄 9935.txt
字号:
end;
procedure Tscanf.C1Click(Sender: TObject);
begin
if imgedit1.ImageDisplayed then
begin
imgedit1.ClearDisplay;
imgedit1.zoom:=100;
end;
end;
procedure Tscanf.N8Click(Sender: TObject);
begin
if (imgedit1.IsClipboardDataAvailable and imgedit1.ImageDisplayed )
then
imgedit1.ClipboardPaste(selleft,seltop);
end;
procedure Tscanf.N1801Click(Sender: TObject);
begin
if imgedit1.ImageDisplayed then
imgedit1.Flip;
end;
procedure Tscanf.N901Click(Sender: TObject);
begin
if imgedit1.ImageDisplayed then
imgedit1.RotateRight
end;
procedure Tscanf.N902Click(Sender: TObject);
begin
if imgedit1.ImageDisplayed then
imgedit1.RotateLeft;
end;
procedure Tscanf.N6Click(Sender: TObject);
begin
imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight);
imgedit1.ClipboardCut(selleft,seltop,selwidth,selheight);
end;
procedure Tscanf.N7Click(Sender: TObject);
begin
imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight);
imgedit1.ClipboardCopy(selleft,seltop,selwidth,selheight);
end;
procedure Tscanf.ImgEdit1SelectionRectDrawn(Sender: TObject; Left,
Top, Width, Height: Integer);
begin
if ((width=0) and (height=0))then
begin
n3.Enabled:=false;
n6.Enabled:=false;
n7.Enabled:=false;
selleft:=left;
seltop:=top;
selwidth:=width;
selheight:=height;
end
else begin
n6.Enabled:=true;
n7.Enabled:=true;
selleft:=left;
seltop:=top;
selwidth:=width;
selheight:=height;
end;
end;
procedure Tscanf.N11Click(Sender: TObject);
begin
if not imgedit1.IsClipboardDataAvailable then
if imgedit1.imagedisplayed then
imgedit1.ClipboardCopy(0,0,imgedit1.Width,imgedit1.Height);
end;
end.
****************************************************************
Delphi易混淆的概念
作者: 林毅
一、Owner和Parent的区别:
Parent属性是指构件的包容器,构件只能在此范围内显示和移动。
举例子如下:
(1)在Form1的窗体上,放一个Panel1,并将Panel1拉大,
(2)在Panel1上放一Button1;
(3)在Form1上放一Button2。
现在如果移动Panel1,则Button1随着Panel1移动,这是因为Button1
的Parent是Panel1。现在将Button2移到Panel1上,再次移动Panel1,
Button2并不跟着移动,这是因为Button2的Parent是Form
1。除在窗体设计中,应注意构件的Parent是谁外,在动态创建构件时,
也应指出构件的Parent,如在上例中继续操作:
1)Procedure Tform1.Button2click(Sender:Tobjet);
2)Var
3) Button:Tbutton;
4) Begin
5) Button:Tbutton.cerate(self);
6) Button.parent=panel1;
7) Button.lleft=0;
8) Button.top=0;
9) Button.caption:='OK';
10) End;
当按Button2时,将在Panel1上创建一个Button,而如果把第6句改
为Button.parent:=self;按Button2时,将在Form1上创建一个Button
了。如果将第6句删除,按Button2时,什么都不会发生,这是因为创建
方法无法知道应在哪里显示构件。
Owner属性是指构件的所有者,它负责构件的创建和释放。如在上例
中,系统默认窗体上所有构件的所有者是窗体,而窗体的所有者是
Application。顺便指出,create方法应带有表示构件所有者的参数,如
在上例中,构件所有者是窗体,即self。
Parent属性和Owner属性是运行阶段的属性,只能在运行阶段,通过
代码设置。
二、Self和Sender的区别:
在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事
件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,
可以使多个构件共用相同的事件处理程序,如下例:
Procedure Tform1.Buttonclick(Sender:Tobject);
Begin
If sender=button1 then
Label1.caption:=′看庭前花开花落
′ Else Label2.caption:=′望天上云卷云舒′
End;
在此例中,Button1,Button2共用了Buttonclick事件处理程序。
Self是指所编的程序范围是在哪一个类中,Delphi中大都在窗体范围
内编程,因此,self即指窗体,如果在编写一个类或是一个组件,则self
指该类或组件。我们在函数或过程的声明中可看出self是代表哪个组件,
即self代表‘.’号之前的组件,如在第一个例子中,self代表Tform1。另
外应注意,self只能用在类方法中,而不能用在过程或函数中,如下例用
法是错的:
Function a1(B:Integer):Integer;
Begin
……
Button:=tbutton.create(self);……
End;
三、Clientheight和Height,Clientwidth和Width的区别:
对于一般的构件而言,Height就是Clientheight,Width就是Clientwidth,
而对于窗体而言,Height是包括标题条在内的高度,而Clientheight是指
窗体工作区的高度。同理,Clientwidth是指定窗体工作区的宽度。
从上面陈述可知,理解Ower和Parent,Self和Sender,Clientheight
和Height,Clientwidth和Width区别,对于Delphi中正确编程是重要的。
****************************************************************
在Visual C++中透明浮动按键的实现
作者:gdssdzl (闪亮)
有一种按键,看起来是一幅完整的图片,当鼠标移到按键区域时,图
片的一部分凸现,形成一个按键,当鼠标移走时又恢复原来状态。
最近,看了一些关于浮动按键的代码,其原理大致上跟CBitmapButton
差不多,用数幅位图代表按键的各个状态,响应鼠标的各种消息来设置按
键的状态,实现按键的浮动显示,但是这样的按键却不能和周围的背景混
和成一幅图片。
为了实现“透明”按键,可以简单地做个试验:先在对话框中加入一
个BUTTON,通过属性框选“Owner Draw”风格,再加入一个PICTURE,并加
入图片,将BUTTON移到PICTURE上。运行结果发现,按键没有显示出来,但
在按键区域按下鼠标时,该按键仍然能发出WM_COMMAND消息,这样一个纯
透明的按键建立了。显然,这个按键是毫无使用意义的,必须让用户容易
觉察到按键的位置,可以把这个按键改造一下:
(首先从CButton派生出一个新类CDrawButton)
把按键的标题显示出来这个实现起来比较简单,我们可以重载CButton类
的成员函数DrawItem(),
void CDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
CRect rect=lpDrawItemStruct->rcItem;//得到按键区域
CString sCaption;
dc.Attach(lpDrawItemStruct->hDC); //得到设备环境CDC
VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);
GetWindowText(sCaption);//得到按键的标题
dc.SetBkMode(TRANSPARENT);//透明显示
CFont* m_pOldFont=dc.SelectObject(m_pFont);
dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
dc.SelectObject(m_pOldFont);
}
其中的m_pFont是成员变量,它保存了对话框的字体指针,为了按键
的标题风格与对话框的字体风格一致,在初始化时调用对话框的成员函数
GetFont()即可得到指向对话框字体的CFont类指针。
使按键浮动显示
要通过自绘来表示按键的各种状态,可填写DRAWITEMSTRUCT来通知
DrawItem()函数需要做什么,我们先了解一下DRAWITEMSTRUCT:
typedef struct tagDRAWITEMSTRUCT{
UINT CtlType; // 控件类型
UINT CtlID;// 控件的ID号
UNIT itemID;//菜单项的索引
UINT itemAction;// 绘图操作
UINT itemState; // 状态
HWND hwndItem; // 控件的窗口句柄
HDC hDC; // 相关的设备环境
RECT rcItem;//控件的范围
DWORD itemData;// 指定与菜单项相联系的应用程序定义的32位值
}DRAWITEMSTRUCT;
利用这个结构先做一个按键状态设置函数:
void CDrawButton::SetButtonMode(UINT action, UINT mode)
{
// TODO: Add your message handler code here and/or call default
DRAWITEMSTRUCT DIS;
DIS.CtlType = ODT_BUTTON;
DIS.CtlID = GetDlgCtrlID();
DIS.itemAction = action;
DIS.itemState = mode;
DIS.hwndItem = GetSafeHwnd();
DIS.hDC = GetDC()->GetSafeHdc();
GetClientRect(&(DIS.rcItem));
SendMessage(WM_DRAWITEM,(WPARAM)GetSafeHwnd(),(LPARAM)&DIS);
ReleaseDC(CDC::FromHandle(DIS.hDC));
}
这样,我们可以响应鼠标的各种消息来设置按键的各种状态:
void CDrawButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(&rect);
if(rect.PtInRect(point)){
if (mBtnStats==BTN_NORMAL){
SetButtonMode(ODA_SELECT, ODS_FOCUS);
SetCapture();
}
}
else{
//AutoLoad(GetDlgCtrlID(),GetParent());
SetButtonMode(ODA_DRAWENTIRE,ODS_DEFAULT);
ReleaseCapture();
}
CButton::OnMouseMove(nFlags, point);
}
这里,mBtnStats是个UINT类型的成员变量,它可以有三种自定义状态:
BTN_NORMAL 正常状态
BTN_UP 鼠标移入按键区域或释放鼠标
BTN_DOWN 按下鼠标
(可以再加一种DISABLE状态)
当在按键区域释放鼠标时,必须发送WM_COMMAND消息:
void CDrawButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(&rect);
if(rect.PtInRect(point)){
if (mBtnStats==BTN_DOWN)
GetParent()->SendMessage(WM_COMMAND,
MAKELPARAM(GetDlgCtrlID(),BN_CLICKED),
(LPARAM)GetSafeHwnd());
SetCapture();
}
else{
SetButtonMode(ODA_DRAWENTIRE,ODS_DEFAULT);
ReleaseCapture();
}
CButton::OnLButtonUp(nFlags, point);
}
接着就是绘制按键的各种状态:由于按键必须“透明”,所以在按下和
释放时只在按键区域的四周加上一个3D边框就行了。而在正常状态下,
则必须去掉边框恢复背景。但如何恢复背景图象呢?我是这样做的:在
按键初始化时,先把被按键覆盖了的区域保存在一个CBitmap类中,以
后需要重绘按键时就把这个CBitmap画在按键上就行了。
void CDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC dc;
CRect rect=lpDrawItemStruct->rcItem;
CString sCaption;
dc.Attach(lpDrawItemStruct->hDC); //得到绘制的设备环境CDC
VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);
if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE){
//重绘控件(正常状态)
mBtnStats=BTN_NORMAL;
if (m_pBitmap!=0){
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(m_pBitmap);
dc.BitBlt(0, 0, rect.Width(), rect.Height(),
&memDC, 0, 0, SRCCOPY);
memDC.DeleteDC();
}
//显示按键标题
GetWindowText(sCaption);
dc.SetBkMode(TRANSPARENT);
if (m_pFont!=0){
CFont* m_pOldFont=dc.SelectObject(m_pFont);
dc.DrawText(sCaption,&rect,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
dc.SelectObject(m_pOldFont);
}
}
if ((lpDrawItemStruct->itemState & ODS_SELECTED) &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -