WaVe's Home

All About Program

导航

SYSCOMMAND - BCB中移动无标题窗口的继续研究

Posted on 2005-02-04 12:20  WaVe  阅读(751)  评论(0)    收藏  举报

/*
 * System Menu Command Values
 * 下面是功能段的其实位置
 * 比如 0xF00~0xF00F是SC_SIZE即改变窗口大小
 * 0xF00~0xF00F之间的值有不同的功能,具体功能见下面
 * Windows可能是根据0xF???的范围来决定功能的,而不是具体的值
 * winuser.h中定义了所有(MS告诉你的)消息对应的值和wParam和lParam对应的值
 */
#define SC_SIZE    0xF000 //窗口大小
#define SC_MOVE   0xF010 //移动窗口
#define SC_MINIMIZE   0xF020 //窗口最消化
#define SC_MAXIMIZE   0xF030
#define SC_NEXTWINDOW  0xF040
#define SC_PREVWINDOW  0xF050
#define SC_CLOSE   0xF060
#define SC_VSCROLL   0xF070
#define SC_HSCROLL   0xF080
#define SC_MOUSEMENU  0xF090
#define SC_KEYMENU   0xF100
#define SC_ARRANGE   0xF110
#define SC_RESTORE   0xF120
#define SC_TASKLIST   0xF130 //弹出开始菜单!
#define SC_SCREENSAVE  0xF140
#define SC_HOTKEY   0xF150
#if(WINVER >= 0x0400)
#define SC_DEFAULT   0xF160
#define SC_MONITORPOWER 0xF170
#define SC_CONTEXTHELP  0xF180 //鼠标箭头右边加了个问号(表面看是这样的)
#define SC_SEPARATOR  0xF00F //改变窗口大小
#endif /* WINVER >= 0x0400 */

一下面代码为例
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
 if(Button == mbLeft)
 {
   ReleaseCapture();
   Perform(WM_SYSCOMMAND, 0x????, 0);
 }
}


0xF001 以右边为基点改变Form.Width
0xF002 以左边为基点改变Form.Width
0xF003 以下边为基点改变Form.Height
0xF004 以右下角为基点改变Form.Width,Form.Height
0xF005 以左下角为基点改变Form.Width,Form.Height
0xF006 以上边为基点改变Form.Height //这一定和0xF002有区别,但在上面代码中看不出来
0xF007 以右上角为基点改变Form.Height
0xF008 以左上角为基点改变Form.Height
0xF009 鼠标位置不变,移动窗口
0xF00A 将鼠标移到标题栏正中间,然后再移动窗口,如果没有标题栏就移动到(Width/2,0),但无法移动

0xF00B 以右下角为基点改变Form.Width,Form.Height。但是改变方式与0xF004不同:鼠标上下移动改变宽度,左右移动改变高度
0xF00C 以左边为基点改变Form.Width //鼠标上下移动改变宽度,左右移动改变高度
0xF00D =0xF002 以左边为基点改变Form.Width
0xF00E =0xF00B 以右下角为基点改变Form.Width,Form.Height。但是改变方式与0xF004不同:鼠标上下移动改变宽度,左右移动改变高度
0xF00F 以右边为基点改变Form.Width //鼠标上下移动改变宽度,左右移动改变高度

0xF010 =0xF00A将鼠标移到标题栏正中间,然后再移动窗口,如果没有标题栏就移动到(Width/2,0),但无法移动
0xF011 鼠标位置不变