Indeling monitor

Status
Niet open voor verdere reacties.

mmatteman

Gebruiker
Lid geworden
3 sep 2008
Berichten
287
Hoe is de indeling van x en y van een monitor?
Klopt het dat linksboven (0,0) is? Zoja, werkt het dan verder als een normaal assenstelsel? Namelijk dat wanneer je naar rechts gaat, de x positief oploopt, en wanneer je naar onder gaat, de y negatief oploopt?
 
Oh laat maar, ik heb het al.
Nu een ander vraagje. Hoe hoog is de windows taskbar? (in pixels)
 
Dat hangt er maar net vanaf, je kunt je taskbar natuurlijk hoger maken en ook hebben sommige mensen hem links staan. Het antwoord is dus echt hangt maar net van de gebruiker af.
 
Ok, ik heb inmiddels een functie daarvoor gevonden en die werkt.
Code:
HWND taskbar = FindWindow("Shell_traywnd", NULL);
RECT rect;
int what = GetWindowRect(taskbar, &rect);

Nu heb ik een ander probleem. Ik probeer een programma te maken waarmee je handmatig vensters selecteert, en die gelijkmatig over het scherm verdeelt. Ik heb het eerst gedaan met vooraf geselecteerde vensters, en dat werkte perfect. Nu wil ik zelf de vensters willen uitkiezen, door het venster naar de voorgrond te halen door er op te klikken, en dan met GetForeGroundWindow() dat venster in te delen. Ik weet alleen niet precies hoe ik dat het beste kan aanpakken. Ook moet de gebruiker, nadat hij het scherm naar de voorgrond heeft gebracht, op 'y' drukken. Dit is wat ik heb:

Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winuser.h>
HWND taskbar = FindWindow("Shell_traywnd", NULL);
RECT rect;
int what = GetWindowRect(taskbar, &rect);

const long MonitorWidth = ::GetSystemMetrics(SM_CXSCREEN);
const long MonitorHeight = ::GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top);



using namespace std;
void ChooseWindow()
{
     while(1)
     if (GetAsyncKeyState(121)==-32767)
     {
            HWND TheWindow = GetForegroundWindow();
            break;
            }
            else {
                 Sleep(10);
                 }
                 }
                                            


int main()
{
 unsigned short int WindowsAmount;
 
 cout << "Hoeveel vensters wilt u verdelen? (2 - 8)" << "\n";
 cin >> WindowsAmount;
 switch(WindowsAmount)
 {
                      
                      case 4:
		      {
HWND TheWindow;
ChooseWindow();                    

SetWindowPos(TheWindow, 
               HWND_TOP,
               0,
               0,
               MonitorWidth / 2,
               MonitorHeight / 2,
               SWP_SHOWWINDOW |
               SWP_NOOWNERZORDER |
               SWP_NOREDRAW
               );
		      
HWND TheWindow4 = FindWindow(NULL, "Naamloos - Paint");
SetWindowPos(TheWindow4, 
               HWND_TOP,
               MonitorWidth / 2,
               0,
               MonitorWidth / 2,
               MonitorHeight / 2,
               SWP_SHOWWINDOW |
               SWP_NOOWNERZORDER |
               SWP_NOREDRAW
               );  
                  
HWND TheWindow5 = FindWindow(NULL, "Naamloos - Kladblok");                       
SetWindowPos(TheWindow5, 
               HWND_TOP,
               0,
               MonitorHeight / 2,
               MonitorWidth / 2,
               MonitorHeight / 2,
               SWP_SHOWWINDOW |
               SWP_NOOWNERZORDER |
               SWP_NOREDRAW
               );
		      
HWND TheWindow6 = FindWindow(NULL, "Document - WordPad");
SetWindowPos(TheWindow6, 
               HWND_TOP,
               MonitorWidth / 2,
               MonitorHeight / 2,
               MonitorWidth / 2,
               MonitorHeight / 2,
               SWP_SHOWWINDOW |
               SWP_NOOWNERZORDER |
               SWP_NOREDRAW
               );      
               }
           break;
default:
        {
        cout << "Invoer is onjuist";

}
}
  
  
  
               
               Sleep(1000);
  
    
}

Zowel de case moet zelf gekozen worden als de vensters. Als ik nu een venster naar voren haal en op y druk, gebeurt er niks. Of komt dat omdat de code voor 'y' verkeerd is?
 
Laatst bewerkt:
Hmm het wil nu wel lukken om een venster te plaatsen, maar dan één, namelijk de laatste (bij 2 is dat rechts, bij 4 rechtsonder). Het lijkt of die daarvoor worden overgeslagen.
 
Laatst bewerkt:
Ik zal even plaatsen wat ik heb (voor het gemak heb ik alleen nog de keuzes voor 2 en 4 vensters gedaan.

[CPP]
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winuser.h>
HWND taskbar = FindWindow("Shell_traywnd", NULL);
RECT rect;
int what = GetWindowRect(taskbar, &rect);
HWND TheWindow;
const long MonitorWidth = ::GetSystemMetrics(SM_CXSCREEN);
const long MonitorHeight = ::GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top);



using namespace std;
int ChooseWindow()
{
while(1)
if (GetAsyncKeyState(VK_RCONTROL))
{
TheWindow = GetForegroundWindow();
break;
}
else {
Sleep(10);
}
}
int Indelen()
{
unsigned short int WindowsAmount;


cin >> WindowsAmount;

switch(WindowsAmount)
{
case 2:
{
cout << "Klik op een venster en druk op y" << "\n";
ChooseWindow();

SetWindowPos(TheWindow,
HWND_TOP,
0,
0,
MonitorWidth / 2,
MonitorHeight,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);

ChooseWindow();

SetWindowPos(TheWindow,
HWND_TOP,
MonitorWidth / 2,
0,
MonitorWidth / 2,
MonitorHeight,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);
break;
}
case 4:
{
cout << "Klik op een venster en druk op y" << "\n";
ChooseWindow();

SetWindowPos(TheWindow,
HWND_TOP,
0,
0,
MonitorWidth / 2,
MonitorHeight / 2,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);

ChooseWindow();

SetWindowPos(TheWindow,
HWND_TOP,
MonitorWidth / 2,
0,
MonitorWidth / 2,
MonitorHeight / 2,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);

ChooseWindow();

SetWindowPos(TheWindow,
HWND_TOP,
0,
MonitorHeight / 2,
MonitorWidth / 2,
MonitorHeight / 2,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);

ChooseWindow();

SetWindowPos(TheWindow,
HWND_TOP,
MonitorWidth / 2,
MonitorHeight / 2,
MonitorWidth / 2,
MonitorHeight / 2,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);

}
break;
default:
{
cout << "Invoer is onjuist" << "\n";
Indelen();
break;
}
}
}



int main()
{
cout << "Hoeveel vensters wilt u verdelen? Kies uit 2 - 4 - 6." << "\n";
Indelen();




Sleep(10000);


}
[/CPP]
 
Hmm.. moet de SetWindowPos op de een of andere manier worden afgesloten nadat ie is uitgevoerd? Als ik Sleep(50) achter elke SetWindowPos zet, gaat het al wat beter, maar nog steeds niet helemaal goed. Ook deelt ie vensters waar ik alleen op heb geklikt in.:confused:
 
Je kan proberen[cpp]
while( GetAsyncKeyState(VK_RCONTROL) )Sleep(50);[/cpp]
boven in de functie int ChooseWindow() te zetten.
Hier door wordt er gewacht tot de toets 'up' is.
Nu wordt het venster 2 keer verplaatst terwijl je maar 1 keer op een toets heb gedrukt.

Een langere Sleep() werkt ook wel. Dan wel voordat de Sleep() voorbij is de toets loslaten.
 
Laatst bewerkt:
Toch nog één vraagje:
[CPP]
SetWindowPos(TheWindow,
HWND_TOP,
(MonitorWidth * (2/3)),
0,
MonitorWidth / 3,
MonitorHeight,
SWP_SHOWWINDOW |
SWP_NOOWNERZORDER |
SWP_NOREDRAW
);
[/CPP]
De bedoeling hier is dat drie schermen horizontaal worden verdeeld over het scherm, er volgen vóór deze functie nog 2 zelfde soort functies, maar dan met andere positie declaraties. Het probleem is dat de eerste twee wel werken, namelijk de eerste krijgt een top-left x van 0, de tweede van (monitorbreedte / 3). De laatste, (MonitorWidth * (2/3)) werkt niet, want het scherm krijgt dan dezelfde x als het eerste scherm, namelijk 0. Wat doe ik fout?
 
(MonitorWidth * (2/3)) = (MonitorWidth * (0)) = 0
Waarschijnlijk wil je het zo ( MonitorWidth * 2 / 3 )
evt. met haakjes ( (MonitorWidth * 2) /3 )
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan