000
10.01.2003, 16:25 Uhr
void*
Generic Pointer (Operator)
|
Erstellt von Uwe
Im API Teil 3 - Menüs, Icons haben wir ein Menü mit verschiedenen Auswahlmöglichkeiten erzeugt.
Die bei der Betätigung der Einträge Öffnen und Speichern sollte sich, wie in jeder Anwendung welche diese Möglichkeit bietet, der entsprechende Auswahldialog öffnen. Es gibt nun zwei Möglichkeiten zur Realisierung. Wir programmieren uns selbst einen solchen Dialog oder wir nutzen das was uns das Betriebssystem bietet. Für uns als 'Anfänger' nutzen wir hier die zweite Variante. Diese Dialogbox gibt es seit Windows 3.1. Microsoft gab nach dem Erscheinen von Win 3.1 die für Standarddialog zuständige commdlg.dll
für die Entwicklung von Programmen frei. Die Prototypen der Dialog befindet sich in commdlg.h
Diesen Header müssen wir in unserer Anwendung aufnehmen. Wir nehmen uns unser Menü-Projekt vor. Bis jetzt waren unsere Anwendungen eigentlich noch übersichtlich. Doch in Zukunft werden immer mehr Funktionen hinzukommen und der Überblick, was hab ich eigentlich wo definiert, geht bei größeren Anwendungen schnell verloren. Wir werden in Zukunft uns eine eigene Headerdatei anlegen, wo wir unsere Includes und eigene Prototypen von Funktionen definieren. Bei mir lautet der selbst vergebene Name der Headerdatei std.h. In dieser neu erzeugten Datei tragen wir nun unsere Includes ein.
C++: |
// std.h
#include < windows.h > #include < commdlg.h > #include "resource.h"
|
Die in < > eingefassten Header sind vom Compiler bereits bereitgestellt Dateien und befinden sich in dessen Includeverzeichnis. Die in " " angegebenen Dateien sind von uns erstellte Header und befinden sich in unserem Entwicklungsverzeichnis. In unserer *.c Datei geben wir nun unseren neuen Header bekannt
C++: |
// dialog.c // Unser neuer Header wird eingebunden #include "std.h"
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; ........... ...........
|
Was wollen wir nun erreichen? "Datei/Öffnen" wird geklickt und der Dialog soll sich öffnen. Bevor das passiert haben wir noch ein paar Dinge zu erledigen. Zunächst unsere Anwendung:
C++: |
// std.h
#include < windows.h > #include < commdlg.h > #include "resource.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); #define FILTER "TextDatei (*.txt)\0*.txt\0HeaderDatei (*.h)\0*.h\0Alle Dateien(*.*)\0*.*\0\0" static OPENFILENAME ofn = {0};
void Oeffnen(); void Speichern();
// dialog.c
#include "std.h"
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg;
WNDCLASSEX wc={0};
wc.cbSize= sizeof (WNDCLASSEX); static char szAppName[]= "Standarddialoge"; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = "USERMENUE"; wc.lpszClassName = szAppName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szAppName, "Standarddialog", 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)== TRUE) { TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam; }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ HDC hdc; PAINTSTRUCT paintstruct; switch(message) { case WM_PAINT: hdc = BeginPaint (hwnd, &paintstruct);
TextOut (hdc, 250, 200, "Der Dateiauswahldialog", 22);
EndPaint (hwnd, &paintstruct); return 0;
case WM_COMMAND: switch(LOWORD(wParam)) { case ID_NEU:
MessageBox(NULL, "Button 'Neu' geklickt", "Menütest", MB_OK); return 0; case ID_OEFFNEN:
Oeffnen();
return 0; case ID_SPEICHERN:
Speichern();
return 0; case ID_BEENDEN: MessageBox(NULL, "Button 'Beenden' geklickt - Programm wird beendet", "Menütest",MB_OK);
SendMessage(hwnd, WM_CLOSE, 0, 0); return 0;
case ID_ITEM1: SetWindowText(hwnd, "Diesen Text in die Titelleiste"); return 0; case ID_ITEM2: SetWindowText(hwnd, "Und jetzt diesen Text"); return 0; case ID_ITEM3: SetWindowText(hwnd, ""); return 0; } return 0;
case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
void Oeffnen() { char DateiName[_MAX_PATH+1] = "";
ofn.lStructSize = sizeof (OPENFILENAME) ; ofn.hwndOwner = NULL; ofn.nMaxFile = _MAX_PATH; ofn.lpstrFile = DateiName; ofn.lpstrFilter = FILTER; if (GetOpenFileName(&ofn)) { switch (ofn.nFilterIndex) { case 1: MessageBox(NULL, "Text Datei", "Öffnen", MB_OK); break; case 2: MessageBox(NULL, "Header Datei", "Öffnen", MB_OK); break; } }
}
void Speichern() { char DateiName[_MAX_PATH+1] = "";
ofn.lStructSize = sizeof (OPENFILENAME) ; ofn.hwndOwner = NULL; ofn.nMaxFile = _MAX_PATH; ofn.lpstrFile = DateiName; ofn.lpstrFilter = FILTER; if (GetSaveFileName(&ofn)) { switch (ofn.nFilterIndex) { case 1: MessageBox(NULL, "Text Datei", "Speichern", MB_OK); break; case 2: MessageBox(NULL, "Header Datei", "Speichern", MB_OK); break; } }
}
|
-- Gruß void* |