Miten ikkuna pienennetään?
No jos ihan vakavia ollaan niin pitkän opiskelun ja tutkiskelun jälkeen sain selville, että se on se pieni viivanappi, mutta nyt on kyse aivan jostain muusta. Siis: Resoluutiota vaihtavissa ohjelmissa olisi hyvä olla pakoreitti käyttöjärjestelmään alt + tab -yhdistelmällä. Tämähän hoituu helposti abstraktilla komponentilla TApplicationEvents. Laitoin OnDeactivate - kohtaan ensin Application.Minimize ja sitten resoluution palautus, mutta pian huomasin, että kyseinen pienennyskäsky aktivoi sovelluksen uudelleen, joka johtaa uudelleen resoluution vaihtumiseen sovelluksen resoluutioon. Tässä se on selvällä pascalin kielellä:
procedure TDMMainModule.EventsActivate(Sender: TObject); begin Check_And_ChangeResolution; end; procedure TDMMainModule.EventsDeactivate(Sender: TObject); begin Application.Minimize; //Tämä aktivoi sovelluksen uudelleen RestoreResolution; end;
Tässä vielä ohjelman kulku
- alt+tab, ohjelma deaktivoituu
- ohjelma pienennetään(ja se aktivoituu uudelleen)
- Resoluutio palautuu käyttöjärjestelmän oletukselle
- Koska ohjelmalla on aktivoitumisviesti jonossa, EventsActivate -proceduuri vaihtaa reson takaisin sovelluksen oletukselle.
Miten tämän voi ratkaista ilman viestihandlereita, kun en niitä vielä hallitse kovinkaan hyvin.
Eikö toimisi sillä, että ensin vaihtaisi resoluution takaisin ja sitten vasta pienentäisi ikkunan?
Ei. Olen kokeillut, mutta eihän sen pitäisikään vaikuttaa mitenkään.
Niinpä tietysti. Enpä tullut ajatelleeksi. Onneksi (tai toisinaan harmiksi) myös Timer toimii viesteillä (WM_TIMER).
procedure TDMMainModule.EventsDeactivate(Sender: TObject); begin MinimizeTimer.Interval := 1; MinimizeTimer.Enabled := True; RestoreResolution; end; procedure TDMMainModule.MinimizeTimerTimer(Sender: TObject); begin Application.Minimize; MinimizeTimer.Enabled := False; end;
Mutta sovellushan aktivoituu kuitenkin application.minimizen kohdalla. Kokeilin kuitenkin tuotakin, mutta ei tuottanut ratkaisua.
Kun puhuin alussa viestihandlereista, niin olin väsännyt tällaisen pätkän:
type TDMMainModule = class(TDataModule) Events: TApplicationEvents; procedure EventsActivate(Sender: TObject); procedure EventsDeactivate(Sender: TObject); protected procedure MSGHookActivation(var Message: TCMActivate); message CM_ACTIVATE; end; var DMMainModule : TDMMainModule; HookActivation : Boolean; procedure TDMMainModule.EventsActivate(Sender: TObject); begin if EnabledResolution then Check_And_ChangeResolution; end; procedure TDMMainModule.EventsDeactivate(Sender: TObject); begin if EnabledResolution then begin HookActivation := True; Application.ProcessMessages; RestoreResolution; end; end; procedure TDMMainModule.MSGHookActivation(var Message: TCMActivate); begin if not HookActivation then begin EventsActivate(Nil); Exit; end; HookActivation := False; end;
Mutta nyt resoluutio ei vaihdu ollenkaan, deaktivoinnin ja aktivoinnin aikana. Tätä tarkoitin sillä, että en oikein hallitse viestejä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.