Re: Как таскать окно по экрану не за заголовок, а за
От: Holms США  
Дата: 28.12.01 15:51
Оценка: 9 (1)
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???


If you need for C++Builder then.
h — file

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:
    void __fastcall ONTest(TMessage&);    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
protected:
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_NCHITTEST, TMessage, ONTest)
    END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


cpp — file
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ONTest(TMessage& msg)
{
    TForm::Dispatch(&msg);
    if(msg.Result == HTCLIENT)
        msg.Result = HTCAPTION;
}
The life is relative and reversible.
Re: Как таскать окно по экрану не за заголовок, а за
От: Dr_Sh0ck Беларусь  
Дата: 28.12.01 19:56
Оценка: 6 (1)
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???


Тут все довольно просто: (см. WM_NCHITTEST). Перекрываешь его, проверяешь, если мышь находится в клиентской области, то возвращаешь HT_CAPTION (я точно имя не помню). Короче говоря, ьы как бы обманываешь вин, говоря ему, что клиент ареа то же, что и заголовок.
Do not fake yourself ;)
ICQ#: 198114726
Re: Как таскать окно по экрану не за заголовок, а за
От: Edward Россия  
Дата: 28.12.01 19:43
Оценка: 3 (1)
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???


все гораздо проще

//обработчик сообщений окна
.......
case WM_LBUTTONDOWN:
SendMessage( hwnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam );
.......
все

Edward
Как таскать окно по экрану не за заголовок, а за
От: alexalex  
Дата: 28.12.01 15:34
Оценка:
Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???
Re: Как таскать окно по экрану не за заголовок, а за
От: VuDZ Россия  
Дата: 28.12.01 15:54
Оценка:
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???


1. при нажатие на любой батон мыши ставиш какой-ньть флажок.
2. при WM_MOUSEMOVE передвигаешь окно
3. при отпускание батона мыши сбрасываеш флаг
Re: Как таскать окно по экрану не за заголовок, а за
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.12.01 05:05
Оценка:
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???


http://www.rsdn.ru/?qna/?ui/wnddrag.xml
Re: Как таскать окно по экрану не за заголовок, а за
От: Игорь Вартанов Ниоткуда  
Дата: 29.12.01 09:58
Оценка:
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???


Нужно посылать в ответ на WM_MOUSEMOVE окну, которое нужно двигать, месседж WM_SYSCOMMAND с параметром SC_MOVE + 1, добавив при этом проверку на нажатие левой кнопки мыши:

    // в процедуре диалога

    case WM_MOUSEMOVE:
        {
            if( MK_LBUTTON == wParam )
            {
                SendMessage( hWnd, WM_SYSCOMMAND, SC_MOVE + 1, 0 );
                // вместо 1 можно прибавлять любое число от 0x1 до 0xF, afair
            }
        }
        break;


Кажется, ничего не напутал, нету под рукой ни MSDN, ни исходника...
Этим способом можно двигать любое окно, не обязательно сам диалог.
Кстати, этот метод не работает для правой кнопки.
---
С уважением,
Игорь
Re: Как таскать окно по экрану не за заголовок, а за
От: Sergei  
Дата: 29.12.01 10:30
Оценка:
Здравствуйте alexalex, Вы писали:

A>Как таскать окно по экрану не за заголовок, а за любое место окна (формы)???

Самой хороший способ, который позволяет передвинать любое окно.
Единственный недостаток обработки HTCAPTION, что при двойном щелчке оно разворачивается
это может быть не совсем удобно, если у тебя использоуется не окно, а какой-нибудь
WinControl.
Поэтому, наверное самое лучшее
при WM_LBUTTONDOWN:
ReleaseCapture;
SendMessage(hWnd,WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0);
Re: Всем спасибо, проблему заборол (давно правда)
От: alexalex  
Дата: 11.10.02 14:05
Оценка:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.