Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 37

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

 GoToForeground;

 // Пока Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΡ… ΠΈ выполняСм

 Letter := ReadStringFromMailslot;

 while Letter <> '' do

 begin

  // АнализируСм ΠΈ выполняСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

  // Команда "s" Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°

  // прилоТСния Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½, поэтому здСсь ΠΌΡ‹ Π΅Π΅ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ

  case Letter[1] of

  'e': OpenFile(Copy(Letter, 2, MaxInt), False);

  'v': OpenFile(Copy(Letter, 2, MaxInt), True);

  end;

  Letter := ReadStringFronMailslot;

 end;

end;


// Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ сообщСния ΠΈΠ· ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ящика

function TDksViewMainForm.ReadStringFromMailslot: string;

var

 MessageSize: DWORD;

begin

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сообщСния Π² ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌ ящикС

 GetMailslotInfo(ServerMailslotHandle, nil, MessageSize, nil, nil);

 // Если сообщСния Π½Π΅Ρ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΏΡƒΡΡ‚ΡƒΡŽ строку

 if MessageSize = MAILSLOT_NO_MESSAGE then

 begin

  Result := '';

  Exit;

 end;

 // ВыдСляСм для сообщСния Π±ΡƒΡ„Π΅Ρ€ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΅Π³ΠΎ Π² этот Π±ΡƒΡ„Π΅Ρ€

 SetLength(Result, MessageSize);

 ReadFile(ServerMailslotHandle, Result[1], MessageSize, MessageSize, nil);

end;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’Π°ΠΊ ΠΊΠ°ΠΊ события ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр прилоТСния ΠΌΠΎΠ³ Π±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π½Π΅ ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌΡƒ ящику, Π° ΠΏΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π±Ρ‹ Π½Π°ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ экзСмпляру, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ событиСм.

1.3.2.4. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ прилоТСния Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½

ΠŸΠ΅Ρ€Π²Π°Ρ копия прилоТСния, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ, Π΄ΠΎΠ»ΠΆΠ½Π° вывСсти сСбя Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½. Казалось Π±Ρ‹, всС просто: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetForegroundWindow ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ вывСсти Ρ‚ΡƒΠ΄Π° любоС ΠΎΠΊΠ½ΠΎ. Однако Ρ‚Π°ΠΊ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Windows 95 ΠΈ NT 4. Π’ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях Π²Π²Π΅Π΄Π΅Π½Ρ‹ ограничСния, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти сСбя Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½ ΠΏΠΎ собствСнному ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ. Ѐункция SetForegroundWindow просто заставит ΠΌΠΈΠ³Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ‡.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° свСрнута, ΠΊΠΎΠΌΠ°Π½Π΄Π° Application.Restore Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ восстанавливаСт ΠΎΠΊΠ½ΠΎ, Π½ΠΎ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΈ трСбуСтся. Ну Π° Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ свСрнута, Ρ‚ΠΎ "Π²Ρ‹Π»ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ· Ρ‡Π°ΠΉΠ½ΠΈΠΊΠ° Π²ΠΎΠ΄Ρƒ ΠΈ Ρ‚Π΅ΠΌ самым сводим Π·Π°Π΄Π°Ρ‡Ρƒ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ": сначала сворачиваСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Application.Minimize, Π° ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ. Π¦Π΅Π»ΠΈ ΠΌΡ‹ добились β€” Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅ΠΌ ΠΏΠ»Π°Π½Π΅.

Π”Π΅Π»ΠΎ ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния ΠΎΠΊΠ½Π° сопровоТдаСтся Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ: Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ сначала сворачиваСтся, Π° ΠΏΠΎΡ‚ΠΎΠΌ разворачиваСтся. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ этот нСприятный эффСкт, ΠΌΠΎΠΆΠ½ΠΎ Π½Π° врСмя сворачивания/разворачивания ΠΎΠΊΠ½Π° Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ этого ΠΌΠ΅Ρ‚ΠΎΠ΄ GoToForeground выглядит Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 1.50.

Листинг 1.50. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ прилоТСния Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½

// ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ прилоТСния Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½

procedure TDKSViewMainForm.GoToForeground;

var

 Info: TAnimationInfo;

 Animation: Boolean;

begin

 // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π»ΠΈ анимация для ΠΎΠΊΠΎΠ½

 Info.cbSize := SizeOf(TAnimationInfo);

 Animation := SystemParametersInfo(SPI_GETANIMATION,

  SizeOf(Info), @Info, 0 and (Info.iMinAnimate <> 0);

 // Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ мСрцания

 if Animation then

 begin

  Info.iMinAnimate := 0;

  SysteParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);

 end;

 // Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ

 if not IsIconic(Application.Handle) then Application.Minimize;

 // ВосстанавливаСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ этом ΠΎΠ½ΠΎ автоматичСски выводится

 // Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½

 Application.RestorΠ΅;

 // Если анимация ΠΎΠΊΠΎΠ½ Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, снова Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΅Π΅

 if Animation than

 begin

  Info.iMinAnimate := 1;

  SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);

 end;

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас сдСлано всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ с двумя ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π½Π΅ ассоциировано Π»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈ Ссли Π΄Π°, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ эту Π°ΡΡΠΎΡ†ΠΈΠ°Ρ†ΠΈΡŽ; Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ запуск Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ прилоТСния, пСрСводя вмСсто этого Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½ ΠΏΠ΅Ρ€Π²ΡƒΡŽ копию; ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ дСйствия.

1.3.3. ΠžΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 3 β€” "ДырявоС" ΠΎΠΊΠ½ΠΎ

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создадим "дырявоС" ΠΎΠΊΠ½ΠΎ. Π’Π΅, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetWindowRgn, Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ "Π΄Ρ‹Ρ€ΠΊΡƒ" Π² ΠΎΠΊΠ½Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ слоТно. Но ΠΌΡ‹ здСсь ΠΏΠΎΠΉΠ΄Π΅ΠΌ дальшС: Ρƒ Π΄Ρ‹Ρ€ΠΊΠΈ Π² нашСм ΠΎΠΊΠ½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΠΌΠΊΠ°, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Ρ‹Ρ€ΠΊΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π°. Как это выглядит, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 1.14.

Рассмотрим Ρ‚Π΅ срСдства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ понадобятся для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого.

1.3.3.1. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_NCHCHITTEST

КаТдоС ΠΎΠΊΠ½ΠΎ Π² Windows дСлится Π½Π° Π΄Π²Π΅ области: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΈ Π½Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠΉ называСтся Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ отобраТаСтся содСрТимоС ΠΎΠΊΠ½Π°. НСклиСнтская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ β€” это Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ слуТСбныС области ΠΎΠΊΠ½Π°: Ρ€Π°ΠΌΠΊΠ°, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, полосы ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, Π³Π»Π°Π²Π½ΠΎΠ΅ мСню ΠΈ Ρ‚.ΠΏ. ПолоТСниС клиСнтской части ΠΎΠΊΠ½Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСклиСнтской опрСдСляСт само ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния WM_NCCALCRECT. МногиС ΠΎΠΊΠ½Π° (особСнно Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ элСмСнты управлСния) Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ нСклиСнтской части.

НСкоторыС сообщСния для клиСнтской части ΠΎΠΊΠ½Π° ΠΈΠΌΠ΅ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈ для нСклиСнтской. НапримСр, пСрСрисовка клиСнтской области осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сообщСния WM_PAINT, Π° нСклиСнтской β€” WM_NCPAINT. НаТатиС Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ Π½Π°Π΄ клиСнтской Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠΊΠ½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сообщСниС WM_LBUTTONDOWN, Π° Π½Π°Π΄ нСклиСнтской β€” WM_NCLBUTTONDOWN ΠΈ Ρ‚.ΠΏ. НСклиСнтская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Π°: Π² Π½Π΅Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΊΠ½ΠΎΠΏΠΊΠΈ сокрытия, разворачивания ΠΈ закрытия ΠΎΠΊΠ½Π°, ΠΈΠΊΠΎΠ½ΠΊΠ° систСмного мСню, Π³Π»Π°Π²Π½ΠΎΠ΅ мСню, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ полосы ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ ΠΈ Ρ€Π°ΠΌΠΊΠ°. Π Π°ΠΌΠΊΠ° Ρ‚ΠΎΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Π° β€” ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π»Π΅Π²ΡƒΡŽ, ΠΏΡ€Π°Π²ΡƒΡŽ, Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ ΠΈ ниТнюю Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΡƒΠ³Π»Π°. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_NCCALCSIZE позволяСт Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, какая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° являСтся нСклиСнтской, Π½ΠΎ Π½Π΅ позволяСт ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅ какая Ρ‡Π°ΡΡ‚ΡŒ нСклиСнтской области находится. Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ сообщСния β€” WM_NCHITTEST. Π’ качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² WM_NCHITTEST ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊ ΠΊΠ°ΠΊΠΎΠΉ части ΠΎΠΊΠ½Π° относится эта Ρ‚ΠΎΡ‡ΠΊΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HTCLIENT ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ клиСнтской части ΠΎΠΊΠ½Π°, HTCAPTION β€” ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ, HTLEFT β€” ΠΊ Π»Π΅Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ Ρ€Π°ΠΌΠΊΠΈ, ΠΌΠ΅Π½ΡΡŽΡ‰Π΅ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΈ Ρ‚.ΠΏ.).

Рис. 1.14. "ДырявоС" ΠΎΠΊΠ½ΠΎ


ΠŸΡ€ΠΈ Π»ΡŽΠ±Ρ‹Ρ… событиях ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ систСма Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ посылаСт ΠΎΠΊΠ½Ρƒ сообщСниС WM_NCHITTEST с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ полоТСния ΠΌΡ‹ΡˆΠΈ. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, систСма Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ дальшС. Π’ частности, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ ΠΎΠΊΠ½Ρƒ посылаСтся WM_NCHITTEST. Π—Π°Ρ‚Π΅ΠΌ, Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±Ρ‹Π» HTCLIENT, посылаСтся сообщСниС WM_LBUTTONDOWN, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” WM_NCLBUTTONDOWN. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΌΡ‹ΡˆΠΈ ΠΎΠΊΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ WM_NCHITTEST β€” это позволяСт систСмС постоянно ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π½Π°Π΄ ΠΊΠ°ΠΊΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠΊΠ½Π° находится курсор, ΠΏΡ€ΠΈ нСобходимости мСняя Π΅Π³ΠΎ Π²ΠΈΠ΄ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ курсора Π½Π°Π΄ Ρ€Π°ΠΌΠΊΠΎΠΉ).

Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ WM_NCHITTEST? НапримСр, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» Π½Π΅ HTCLIENT, Π° HTCAPTION? Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ события ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ Π½Π°Π΄ клиСнтской ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π½Π°Π΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·ΡΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Π° Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ‰Π΅Π»Ρ‡ΠΎΠΊ Π½Π° Π½Π΅ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΡŽ ΠΎΠΊΠ½Π°. Однако это ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° ΠΌΡ‹ΡˆΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вмСсто клиСнтских "ΠΌΡ‹ΡˆΠΈΠ½Ρ‹Ρ…" сообщСний ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ нСклиСнтскиС.

Π‘ практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΡΠΊΠ°Ρ‚ΡŒ Π·Π° Π»ΡŽΠ±ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ интСрСсно (особСнно это касаСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ VCL: Π½Π° ΠΌΡ‹ΡˆΡŒ пСрСстанСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ само ΠΎΠΊΠ½ΠΎ, Π½ΠΎ ΠΈ располоТСнныС Π½Π° Π½Π΅ΠΌ Π½Π΅ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ элСмСнты управлСния). Однако ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ WM_NCHITTEST ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ довольно интСрСсныС эффСкты. НапримСр, ΠΏΠΎΠ»ΠΎΠΆΠΈΠ² Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ панСль ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Ρƒ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ WM_NCHITTEST Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΌΡ‹ΡˆΠΈ ΠΎΠΊΠΎΠ»ΠΎ Π³Ρ€Π°Π½ΠΈΡ† ΠΏΠ°Π½Π΅Π»ΠΈ возвращался Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ частям Ρ€Π°ΠΌΠΊΠΈ с измСняСмым Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ панСль, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ смоТСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ: систСма Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΊΠ°ΠΊ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ€Π°ΠΌΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΡ‚ΡΠ½ΡƒΡ‚ΡŒ. (ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ "ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСняСт свои Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ run-time Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ это происходит Π² design-time" http://www.delphikingdom.com/asp/viewitem.asp?catalogid=22.) Ѐантазия ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы получСния интСрСсных эффСктов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ WM_NCHITTEST.