Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Перетаскивание формы   Найти похожие ветки 

 
vvvaaa   (2005-08-25 15:13) [0]

procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;

   ...

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
 inherited;
 if M.Result = htClient then M.Result := htCaption;
end;

А как сделать этоже на чистом API?


 
Leonid Troyanovsky ©   (2005-08-25 15:31) [1]


> vvvaaa   (25.08.05 15:13)  
> А как сделать этоже на чистом API?


Например, можно сделать на грязном,
а потом слегка почистить.

--
Regards, LVT.


 
vvvaaa   (2005-08-25 15:57) [2]

ok покажи как на на грязном, а на счет почисить чёнить придумаю


 
alpet ©   (2005-08-25 15:59) [3]

Создай окно, организуй ему оконную процедуру, и запусти цикл сообщений. Для сообщения сделай проверку в оконной процедуре.

Simple demonstration code:

Uses Windows, Messages, ExtCtrls, Printers;
var hMainWnd: THandle;
   hCtrls: array of THandle;
   msg: tagMSG;

function RegClassEx (name: PAnsiChar; wFunc: Pointer; style: dword): Boolean;
var
  wclass: WNDCLASSEXA;
begin
result := true;
fillchar (wclass, sizeof (wclass), 0);
wclass.cbSize := sizeof (wclass);
if not GetClassInfoEx (hInstance, PChar (name), wclass) then
 begin
  wclass.cbSize := sizeof (wclass);
  wclass.lpszClassName := name;
  wclass.lpfnWndProc := wFunc;
  wclass.style := style;
  wclass.hInstance := hInstance;
  wclass.hbrBackground := GetSysColorBrush (COLOR_BTNFACE);
  wclass.hCursor := LoadCursor (0, IDC_ARROW);
  result := RegisterClassEx (wclass) <> 0;
 end;
end;

function OnCreate: Bool;
begin
// some actions on create
result := false;
end;

function MainWndFunc (hWnd: THandle; uMsg, wParam, lParam: dword): Integer; stdcall;
var bHandled: Bool;
begin
result := 0;
bHandled := false;
case uMsg of
 WM_CREATE: bHandled := OnCreate;
 WM_CLOSE: bHandled := DestroyWindow (hWnd);
end;
if not bHandled then result := DefWindowProc (hWnd, uMsg, wParam, lParam);
end; // MainWndFunc

function CreateWndIndirect (const cs: tagCREATESTRUCTA; ctrl_id: dword = 0): HWND;
begin
with cs do
result := CreateWindowEx (dwExStyle, lpszClass, lpszName,
                          style, x, y, cx, cy,
                          hwndParent, 0, hInstance, @cs);
if (ctrl_id <> 0) and (result <> 0) then
   SetWindowLong (result, GWL_ID, ctrl_id);
end;

procedure SetCSRect (var cs: tagCREATESTRUCTA; x, y, cx, cy: Integer);
begin
cs.x := x;
cs.y := y;
cs.cx := cx;
cs.cy := cy;
end;

const wClassName = "DemoWindowClass";
var cs: tagCREATESTRUCTA;
begin
{ ... }
if not RegClassEx (wClassName, @MainWndFunc,
                      CS_HREDRAW or CS_VREDRAW or CS_OWNDC) then exit;

fillChar (cs, sizeof (cs), 0);
cs.dwExStyle := WS_EX_APPWINDOW or WS_EX_CONTROLPARENT or WS_EX_DLGMODALFRAME;
cs.style := WS_VISIBLE or WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW or WS_TABSTOP;
cs.lpszName := "Caption";
cs.lpszClass := wClassName;
cs.hInstance := hInstance;
SetCSRect (cs, CW_USEDEFAULT, CW_USEDEFAULT, 240, 150);
hMainWnd := CreateWndIndirect (cs);
{ Creating child controls }
SetLength (hCtrls, 2);
cs.lpszClass := "button";
cs.lpszName := "ok";
cs.hwndParent := hMainWnd;
cs.style := BS_PUSHBUTTON or WS_VISIBLE or WS_CLIPSIBLINGS or WS_CHILD or WS_TABSTOP;
cs.dwExStyle := 0;
SetCSREct (cs, 10, 10, 200, 25);
hCtrls [0] := CreateWndIndirect (cs, 101);
cs.lpszName := "cancel";
SetCSRect (cs, 10, 50, 200, 25);
hCtrls [1] := CreateWndIndirect (cs, 102);

while (IsWindow (hMainWnd) and GetMessage (msg, 0, 0, 0)) do
 begin
  TranslateMessage (msg);
  DispatchMessage (msg);
  if (msg.message = WM_CHAR) and (msg.wParam = VK_TAB) then
   begin
    //PostMessage (hMainWnd, WM_NEXTDLGCTL, 0, 0);
    if GetFocus = hCtrls [0] then SetFocus (hCtrls [1]) else SetFocus (hCtrls [0]);
   end;
 end;
end.


 
vvvaaa   (2005-08-25 16:06) [4]

Спасибо конечно, но как создавать форму и объекты я знаю. Меня интересует конкретно обработка собщения WM_NCHITTEST


 
Leonid Troyanovsky ©   (2005-08-25 16:19) [5]


> vvvaaa   (25.08.05 15:57) [2]
> ok покажи как на на грязном, а на счет почисить чёнить придумаю


Вставь в оконную процедуру, что-то вроде:


 case msg of
  ..
  WM_NCHITTEST:
    begin
      Result := DefWindowProc(wnd, msg, awparam, alparam);
        if Result = HTCLIENT then
          begin
            Result := HTCAPTION;
            Exit;
          end;
    end;


--
Regards, LVT.


 
vvvaaa   (2005-08-25 16:26) [6]

> Leonid Troyanovsky ©   (25.08.05 16:19) [5]
Спасибо, то что надо



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.035 c
14-1129034852
NewWonder
2005-10-11 16:47
2005.10.30
Проблема с принтером HP 1000


14-1128867441
Vudu
2005-10-09 18:17
2005.10.30
Ктонибудь пробовал продовать программы в plati.ru


2-1128118304
SergProger
2005-10-01 02:11
2005.10.30
Помогите разбраться с TFileStream


3-1127094224
DimonS
2005-09-19 05:43
2005.10.30
Как правильно сложить несколько полей?


14-1128890780
NightLord
2005-10-10 00:46
2005.10.30
IE