Сейчас на форуме: tyns777, JustLife, zds, 2nd, morgot, Rio, CDK123, tihiy_grom (+4 невидимых)

 eXeL@B —› Программирование —› Перетаскивать окно за любую точку.
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 06 февраля 2009 22:04 · Поправил: Mavlyudov
· Личное сообщение · #1

Если делать для стандартного приложения в делфи, то перетаскивание будет выглядеть вот так:

public
procedure ttt(var M:TMessage); message WM_NCHITTEST;
end;
.......................................
procedure TForm1.ttt(var M:TMessage);
begin
inherited;
if M.Result = htClient then M.Result := htCaption;
end;

Но у меня консольное приложение, в котором я решил создать форму:

form: TForm;
form := TForm.Create(Application);
.........
Как тут сделать перетаскивание???
нужно ведь как-то динамически привязать message к форме...

Что-то типа
ReleaseCapture;
form.perform(WM_SysCommand, $F012, 0);

не помогает..



Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 10 февраля 2009 04:43 · Поправил: Halt
· Личное сообщение · #2

Clerk
я там описался похоже, написан действительно бред, ... не помню точно но мысль такая что если включить в uses forms, classes и прочую дрбедень получится +300-400 кб к объему файла, тогда смысл извращаться с созданием формы руками вообще как-то пропадает... , а если писать на Api такого не будет....

F_a_u_s_t

сдается мне гуевый интерфейс задумывается для чего-то... но даже в этом случае наоборот как-то делается все.. ну в общем автору помогли похоже и ладно, а остальное не суть...



Ранг: 17.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 10 февраля 2009 06:21 · Поправил: zombiee
· Личное сообщение · #3

to Halt:
Да не заморачивайся так) человек прсил динамическое создание vcl формы без записи формы в ресурсы (.dfm в RCDATA). Ему дали варианты + твой вариант на winapi) Думаю, он разберётся) А между делом я бы всем посоветовал юзать visg ;)



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 февраля 2009 12:46
· Личное сообщение · #4

Mavlyudov
Уточни что есть консольное приложение. Возможны два варианта:
> Консоль создаётся и обслуживается csrss.
> Консоль создаётся и обслуживается твоим приложением.
В первом случае без инжекта в csrss эту задачу решить нельзя(разумеется из Ring3).



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 февраля 2009 13:30
· Личное сообщение · #5

Вот кстати посмотрел функционал предоставляемый клиенту, вроде нет возможности отловить перемещение мыши в окне:
Code:
  1. // Message format for messages sent from the client to the server
  2. //
  3. typedef enum _CONSOLE_API_NUMBER {
  4.     ConsolepOpenConsole = CONSRV_FIRST_API_NUMBER,
  5.     ConsolepGetConsoleInput,
  6.     ConsolepWriteConsoleInput,
  7.     ConsolepReadConsoleOutput,
  8.     ConsolepWriteConsoleOutput,
  9.     ConsolepReadConsoleOutputString,
  10.     ConsolepWriteConsoleOutputString,
  11.     ConsolepFillConsoleOutput,
  12.     ConsolepGetMode,
  13.     ConsolepGetNumberOfFonts,
  14.     ConsolepGetNumberOfInputEvents,
  15.     ConsolepGetScreenBufferInfo,
  16.     ConsolepGetCursorInfo,
  17.     ConsolepGetMouseInfo,
  18.     ConsolepGetFontInfo,
  19.     ConsolepGetFontSize,
  20.     ConsolepGetCurrentFont,
  21.     ConsolepSetMode,
  22.     ConsolepSetActiveScreenBuffer,
  23.     ConsolepFlushInputBuffer,
  24.     ConsolepGetLargestWindowSize,
  25.     ConsolepSetScreenBufferSize,
  26.     ConsolepSetCursorPosition,
  27.     ConsolepSetCursorInfo,
  28.     ConsolepSetWindowInfo,
  29.     ConsolepScrollScreenBuffer,
  30.     ConsolepSetTextAttribute,
  31.     ConsolepSetFont,
  32.     ConsolepSetIcon,
  33.     ConsolepReadConsole,
  34.     ConsolepWriteConsole,
  35.     ConsolepDupHandle,
  36.     ConsolepGetHandleInformation,
  37.     ConsolepSetHandleInformation,
  38.     ConsolepCloseHandle,
  39.     ConsolepVerifyIoHandle,
  40.     ConsolepAlloc,
  41.     ConsolepFree,
  42.     ConsolepGetTitle,
  43.     ConsolepSetTitle,
  44.     ConsolepCreateScreenBuffer,
  45.     ConsolepInvalidateBitmapRect,
  46.     ConsolepVDMOperation,
  47.     ConsolepSetCursor,
  48.     ConsolepShowCursor,
  49.     ConsolepMenuControl,
  50.     ConsolepSetPalette,
  51.     ConsolepSetDisplayMode,
  52.     ConsolepRegisterVDM,
  53.     ConsolepGetHardwareState,
  54.     ConsolepSetHardwareState,
  55.     ConsolepGetDisplayMode,
  56.     ConsolepAddAlias,
  57.     ConsolepGetAlias,
  58.     ConsolepGetAliasesLength,
  59.     ConsolepGetAliasExesLength,
  60.     ConsolepGetAliases,
  61.     ConsolepGetAliasExes,
  62.     ConsolepExpungeCommandHistory,
  63.     ConsolepSetNumberOfCommands,
  64.     ConsolepGetCommandHistoryLength,
  65.     ConsolepGetCommandHistory,
  66.     ConsolepSetCommandHistoryMode,
  67.     ConsolepGetCP,
  68.     ConsolepSetCP,
  69.     ConsolepSetKeyShortcuts,
  70.     ConsolepSetMenuClose,
  71.     ConsolepNotifyLastClose,
  72.     ConsolepGenerateCtrlEvent,
  73.     ConsolepGetKeyboardLayoutName,
  74.     ConsolepGetConsoleWindow,
  75. #if defined(FE_SB) // for Kernel32 Single Binary
  76.     ConsolepCharType,
  77.     ConsolepSetLocalEUDC,
  78.     ConsolepSetCursorMode,
  79.     ConsolepGetCursorMode,
  80.     ConsolepRegisterOS2,
  81.     ConsolepSetOS2OemFormat,
  82. #if defined(FE_IME)
  83.     ConsolepGetNlsMode,
  84.     ConsolepSetNlsMode,
  85.     ConsolepRegisterConsoleIME,
  86.     ConsolepUnregisterConsoleIME,
  87. #endif // FE_IME
  88. #endif // FE_SB
  89.     ConsolepGetLangId,
  90.     ConsolepMaxApiNumber
  91. } CONSOLE_API_NUMBER, *PCONSOLE_API_NUMBER;





Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 11 февраля 2009 01:39
· Личное сообщение · #6

Clerk
Я сделал так, как сделал zombiee в своем примере:

type
TMyEventHandler = class
public
procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ExitClick(Sender: TObject);
end;
............
var
DragMouse: TMyEventHandler;
.................
procedure TMyEventHandler.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
form.Perform(WM_SYSCOMMAND, SC_MOVE+2, 0);
end;
.................
form:=TForm.Create(Application);
form.OnMouseDown:=DragMouse.MouseDown;



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 11 февраля 2009 02:25 · Поправил: Clerk
· Личное сообщение · #7

Mavlyudov
Ну я хз, порой трудно понять что нужно. По началу я думол что тебе нужно простое окно(своё) перетаскивать, затем я прочитал что консольное приложение делоешь, я посчитал что ты хочешь консоль перетаскивать..
> нужно ведь как-то динамически привязать message к форме...
Не понятно, совсем; такие выражения лудей путоют


<< . 1 . 2 .
 eXeL@B —› Программирование —› Перетаскивать окно за любую точку.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати