Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Windows-Skelettprogramm
von Plapperkatze am 28.Januar 2006 um 17:58
zurück zur Kategorie "Tutorials"

Genauso wie Konsolenprogrammen haben auch Windowsprogramme einen Einsprungspunkt. Dieser heisst hier nicht int main(int argc, char *argv[]) sondern int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow). Somit ist folgender Code schonmal lauffähig.
#include <windows.h>
int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL,"bla","blub",MB_ICONINFORMATION);
 return 0;
}
Um Windowsprogramme zu kompilieren, müsst ihr ein paar Dinge berücksichtigen. Der Compiler muss wissen, dass er nur kompilieren, aber nicht linken soll, ausserdem, dass es sich um ein Windowsproggie handelt. Folgendes funktioniert bei mir:
bcc32 -c -tWM- -w -w-par -w-inl -W -a1 -Od quelldatei.cpp
Ausserdem müsst ihr import32.lib und cw32.lib verlinken, beispielsweise so:
ilink32 -aa -c -x -Gn quelldatei.obj c0w32.obj,quelldatei.exe,,import32.lib cw32.lib,,

Wenn ihr renegade verwendet, müsst ihr unter Options bei libs
import32.lib cw32.lib
hinzufügen und dann mit "Compile->Win EXE" (F9) das Win-Executable erzeugen lassen.



bei Fehlern im Compiler:
[to be done]

bei Fehlern im Linker:
unresolved external: ihr habt evtl. die libs nicht korrekt eingebunden
unknown c0w32.obj: eure ilink32.cfg im bin-Verzeichnis ist evtl. falsch

Benutzt das formular, um mich zu ergänzen ;)


Also nun ein "echtes Fenster".. ^^
#include <windows.h>

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

const char szAppName[]    = "mein Windowsprogramm";

int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
  MSG        msg;
  HWND       hWnd;
  WNDCLASS   wc;
 
  wc.style               = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc         = WndProc;
  wc.cbClsExtra          = 0;
  wc.cbWndExtra          = 0;
  wc.hInstance           = hInstance;
  wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
  wc.hbrBackground       = (HBRUSH) GetStockObject(WHITE_BRUSH);
  wc.lpszClassName       = szAppName;
  wc.lpszMenuName        = NULL;
 
  RegisterClass(&wc);
 
  hWnd = CreateWindow(   szAppName,
                         szAppName,
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         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)
{
  switch (message)
  {
     case WM_PAINT:
     {
        PAINTSTRUCT ps;
        HDC         hDC;
        const char  szText[] = "Textaugabe mit der GDI";
        hDC = BeginPaint(hWnd, &ps);
        TextOut(hDC, 50, 50, szText, sizeof(szText) - 1);
        EndPaint(hWnd, &ps);
        return 0;
     }
     case WM_DESTROY:
     {
        PostQuitMessage(0);
        return 0;
     }
  }
  return DefWindowProc(hWnd, message, wParam, lParam);
}


Mit
RegisterClass(&wc);
wird eine Windows-Klasse registriert. Wir registrieren mir einem Klassen-Namen (wc.lpszClassName), den wir benötigen, um mit CreateWindow() ein Fenster zu erzeugen. wc.lpfnWndProc zeigt dabei auf WndProc.
Sobald die Klasse registriert ist, sendet Windows Nachrichten (WM_PAINT oder WM_DESTROY sind nur ein Beispiel) an das Programm. Diese Nachrichten werden in WdnProc verarbeitet, wobei uninteressante Daten mit "return DefWindowProc(hWnd, message, wParam, lParam);" an das System zurückgegeben werden.
Wir fangen WM_PAINT ab, diese Nachricht sendet Windows an das Programm, wenn unser Fenster, aus egal welchen Gründen, neu gezeichnet werden muss.
     case WM_PAINT:
     {
        PAINTSTRUCT ps;
        HDC         hDC;
        const char  szText[] = "Textaugabe mit der GDI";
        hDC = BeginPaint(hWnd, &ps);
        TextOut(hDC, 50, 50, szText, sizeof(szText) - 1);
        EndPaint(hWnd, &ps);
        return 0;
     }
Um mit Windows zu zeichnen, benötigt man ein Handle auf einen DeviceContext (HDC.. sozusagen eine "Zeichenerlaubnis"). Diesen DC muss man an Windows zurückgeben, sobald die Operationen beendet sind. BeginPaint benötigt zum Aufruf ein Fenster-Handle und eine PAINTSTRUCT Struktur und gibt ein Handle auf einen DeviceContext zurück. Mit diesem Handle kann man nun zeichnen, hier zB eine Textausgabe. EndPaint gibt das Handle wieder frei.



zurück zur Kategorie "Tutorials"
[1 Kommentare]

toyy (Gast) schrieb am 28. Januar 2006 um 23:20
bla bla bla ?

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 220706 Besucher seit dem 23.01.2012 Login