Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 20:03

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



WinApi Buttons immer genau in der Mitte Positionieren

Discussion on WinApi Buttons immer genau in der Mitte Positionieren within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
WinApi Buttons immer genau in der Mitte Positionieren

Guten Tag zusammen.
Ich habe mich gestern entschlossen mithilfe der Tutorials auf WinApi.de langsam mal in die Gui Programmierung in C++ einzusteigen.Es klappt auch bis jetzt alles ganz gut habe bis dato ein Fenster mit einem Button und einem Textfeld erstellt zur Übung.
Nun tut sich mir aber die Frage auf: Muss ich immer mithilfe irgendwelcher Koordinaten "rumexperimentieren" um meine Buttons/ Textfelder etc an den richtigen Platz zu bekommen ,oder gibt es z.B. Funktionen welche mir die Mitte meines Fenster bestimmen können und mir die x/y Koordinaten zurückgeben? Es geht sich darum mein Hauptfenster hat eine Größe von 300 in der Breite und 350 in der höhe wenn ich nun aber einen Button erstelle welcher in der Mitte des Fensters erscheinen soll habe ich mir zuerst gedacht gut ich übergebe diesem dann einfach die hälfte der Werte ( Also 150 in der Breite und 175 in der höhe)wenn ich das aber mache ist der Button nicht in der Mitte ,sondern irgendwo in meinem Fenster.Deshalb wäre es interessant für mich zu erfahren woran das denn liegt ,und wie ich Buttons/ Textfelder etc nun mittig platzieren kann ohne das "rumprobieren".Außerdem geht es mir darum ,dass wenn mein Fenster maximiert sind die Buttons natürlich auch an ganz anderen Koordinaten sind als vorher ,sprich wenn ich in der normalen Fenstergröße einen Button mittig platziert habe dieses Fenster aber maximiert wird ist er irgendwo nur nichtmehr mittig .
Ich hoffe ihr versteht soweit was mein Problem ist hier ist noch mein Quellcode falls es jmd hilft:
Code:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   PSTR szCmdLine, int iCmdShow)
{
   MSG        msg;
   HWND       hWnd;
   WNDCLASS   wc;
   
   const char szAppName[]  = "Windows Buttons";
   
   wc.cbClsExtra           = 0;
   wc.cbWndExtra           = 0;
   wc.hbrBackground        =  CreateSolidBrush( RGB(80,20,100)) ;


   wc.hCursor              = LoadCursor(NULL, IDC_ARROW);
   wc.hIcon                = LoadIcon(NULL, IDI_APPLICATION);
   wc.hInstance            = hInstance;
   wc.lpfnWndProc          = WndProc;
   wc.lpszClassName        = szAppName;
   wc.lpszMenuName         = NULL;
   wc.style                = CS_HREDRAW | CS_VREDRAW;
   
   RegisterClass(&wc);
   
   hWnd = CreateWindow(    szAppName,
                           szAppName,
                         WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX , //WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                       CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                       350,          /* Fensterbreite              */
                      300,          /* Fensterhoehe               */
                           NULL,
                           NULL,
                           hInstance,
                           NULL);
   
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
   
   while (GetMessage(&msg, NULL, 0, 0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   
   return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ static HWND hButton;
   
   switch (message)
   {

   case WM_PAINT:
	   {
	   PAINTSTRUCT ps;
       HDC         hDC;
	   const char  szText[] = "Hallo, dies ist der Text.";
	   hDC = BeginPaint(hWnd, &ps);
        {        
	    TextOut(hDC, 90, 12, szText, sizeof(szText) - 1);   //2 Parameter von Links 3. von oben
        }
        EndPaint(hWnd, &ps);
		   return 0;
      }
	   
	   


   case WM_CREATE:
      {
	    hButton = CreateWindow(  "button",
                                  "Button1",
                                  WS_CHILD | WS_VISIBLE,
                                  0, 0, 0, 0,
                                  hWnd,
                                  NULL,
                                  ((LPCREATESTRUCT) lParam) -> hInstance,
                                  NULL);
         return 0;
      }
   case WM_SIZE:
      {    MoveWindow(hButton,150,175,100,20, TRUE);
         return 0;
      }  
   case WM_COMMAND:
      {
         if (lParam == (LPARAM)hButton)
         {
            if (HIWORD(wParam) == BN_CLICKED)
               MessageBox(hWnd,"Button wurde geklickt","Juhu",NULL);
			  SendMessage(hWnd, WM_CLOSE, 0, 0);

         }
         return 0;
      }
   case WM_DESTROY:
      {
         PostQuitMessage(0);
         return 0;
      }
   }
   return DefWindowProc(hWnd, message, wParam, lParam);
}
marykillsjane is offline  
Old 02/18/2013, 17:10   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Ich kann nur von Objective-C und nicht von C++ und der WinAPI berichten, aber das sollte am Ende im Prinzip der selbe Vorgang sein:

Du übergibst ja die X-Position und Y-Position. Soweit ich weiß, geht das Programm im Normalfall davon aus, dass diese X/Y-Postion oben links von deinem Objekt (Button, Fenster, Label, wie auch immer) ist. Also an der linken oberen Ecke.

Wenn der Button jetzt in der Mitte sein soll, musst du also als X-Koordinate die Hälfte der Fensterbreite nehmen und die Hälfte deines Buttons abziehen. Also z.B. 150 - (button.width / 2).

Damit es beim Resizen angepasst wird: Hm, da gibt es bestimmt eine Funktion, die beim Resizen aufgerufen wird / überschrieben werden kann? Wie in Java halt.
Da musst du dann den Frame des Buttons dann neu anpassen, wieder mit window.width / 2 - button.width / 2.

So sollte das zumindest theoretisch klappen, evtl. hilft es dir ja.
snow is offline  
Thanks
1 User
Old 02/18/2013, 17:45   #3


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Jup, fürs Resizen gibts afaik ne Message. Ansonsten wäre da auch noch die Funktion GetWindowRect.
MrSm!th is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Bilder / Buttons positionieren
01/17/2013 - Web Development - 8 Replies
Hey Leute, ich versuche momentan Bilder bzw Buttons an eine bestimmte stelle zu positionieren . Als momentane "Lösung" habe ich : <style> #button-obl { position:absolute; margin-top:10px; margin-left:25px; }
Code um Bild anzuzeigen und in der Mitte des Desktops zu positionieren
12/07/2012 - AutoIt - 2 Replies
Hallo EPVP, ich brauche mal eure Hilfe da ich eins von diesen Basics nicht hinkriege. Ich hätte gerne ein Fenster mit zwei Buttons, wobei beim Klick des linken Buttons Bild 1 in der Mitte des Bildschirms (die ist ja unterschiedlich je nach Desktopgröße) angezeigt wird und sobald man auf den rechten Button klickt, Bild 2 in der Mitte angezeigt wird und das Bild 1 wieder weg ist. Bis jetzt hab ich nur Bilder anzeigen hinbekommen, den wechsel zwischen zwei Bildern und die Positionierung in...
Problem wenn Buttons Disable dann Enable sind die buttons zum senden zu verwenden
11/19/2009 - AutoIt - 5 Replies
also hab ja durch hilfe geschafft buttons mit Checkbox Enable und disable zu machn nur mein prob ist jetzt das ich die buttons nicht verwenden kann hab schon einiges ausprobiert aber wenn ich dann bsp button1 drücke passiert einfach nix kann mir wer helfen `? bekommt thx für ;) hier der code: #include <GUIConstantsEx.au3> GUICreate("") $check = GUICtrlCreateCheckbox("Enable/Disable Buttons", 10, 10, 140, 20) $button = GUICtrlCreateButton("Button",10,50) $button1 =...
[Buttons]Hi wer kann mir die Buttons erklären
08/16/2009 - Metin2 Private Server - 6 Replies
Hi ich will kg machen,kenne aber die bedeutung der buttons nich könnt ihr mir vllt.helfen MfG TheRisk Hier ein Screen:http://img16.imageshack.us/img16/3016/gaul. jpg
Vista style aero deinstaliert buttons immer noch so
04/10/2008 - Technical Support - 3 Replies
also ich wollte ma vista style haben doch der gefiel mir nit so naja eig schon nur als ich wieder den XP style wollte auf meinem PC, da blieb es so also die buttons und so naja nur einige sachen wurden zurückgeändert bei der software habe ichs auch weggemacht was nun bitte helft mir



All times are GMT +2. The time now is 20:03.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.