"Zusatzfenster" öffnen

Hallasas

Erfahrenes Mitglied
Hallo.
Ich möchte mit meinem Programm ein weiteres "Fenster" öffnen.
Mein Programm hat die "ganz normale Hauptfunktion" und die "Callback" Funktion.
Doch nun möchte ich gerne ein weiteres "ws_ex_toolwindow" mit einem Tastendruck öffnen.
Ich habe schon "herumgebastelt", jedoch funktioniert nichts.

Gruß Hallasas
 
Da reicht eigentlich ein normales CreateWindow aus. Du mußt nur in der Nachrichtenschleife aufpassen, dass du da niemals ein HWND in Peek/GetMessage einsetzt. Generell da immer NULL für den HWND-Parameter einsetzen.

Falls das nicht hilft, werde ein bißchen ausführlicher:

Welche Bibliothek? (MFC,Win32 direkt)
Was heißt "funktioniert nicht"? (Kein Fenster, Fenster reagiert nicht, Rechner kackt ab, Fahrrad im Keller fällt um)
Zeige deinen Code.
 
Der Compiler sagt "Alles Paletti!", jedoch öffnet sich nichts...
C++:
#include <windows.h>

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

char szClassName[ ] = "TEST";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;       
    MSG messages;    
    WNDCLASSEX wincl;   

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;  
    wincl.style = CS_DBLCLKS;               
    wincl.cbSize = sizeof (WNDCLASSEX);

    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;          
    wincl.cbClsExtra = 0;           
    wincl.cbWndExtra = 0;                 
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (
           0,               
           szClassName,     
           szClassName,     
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,    
           CW_USEDEFAULT,   
           544,          
           375,             
           HWND_DESKTOP,     
           NULL,              
           hThisInstance,     
           NULL );

    ShowWindow (hwnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_KEYDOWN:
        {
             case VK_F4:
                  {
             HWND hwnd_new;
             HINSTANCE hnew;
             int cmdnew;
             
            CreateWindowEx (
           0,               
           szClassName,     
           szClassName,     
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,    
           CW_USEDEFAULT,   
           544,          
           375,             
           HWND_DESKTOP,     
           NULL,              
           hnew,     
           NULL );
           
           ShowWindow( hwnd_new , cmdnew );
           
           return 0;
           }
        }
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:            
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Hoffe, ich mache nicht zu viel falsch :)
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Du weist weder hwnd_new noch cmdnew je irgendwelche Werte zu. Das sollte doch hwnd_new = CreateWindow ... sein?

Du kannst statt da immer noch ein ShowWindow anzuschließen, direkt den Style WS_VISIBLE mitgeben.
 
Danke für die schnelle Hilfe,
jedoch ändert sich nichts nach Anpassen deiner Modifikationen...

Gruß
 
hallo,
musst du nicht nach case WM_KEYDOWN: noch einmal switch(wParam) anfangen? Also so:
Code:
switch (message)
    {
        case WM_KEYDOWN:
        {
        switch(wParam)
             {
                case VK_F4:
                  {
               //dein Code
                  }
              }
          }
      }
hoffe das hilft irgendwie
gruß
bastionmancher
 
hallo nochmal,
bei mir funktionierts jetzt mit diesem Code:
Code:
#include<windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	MSG msg;
	HWND hWnd;
	WNDCLASS wc;
	int fehler;

	const char szAppName[]="erstes Fenster";

	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor=LoadCursor(NULL, IDI_APPLICATION);
	wc.hInstance=hInstance;
	wc.lpfnWndProc=WndProc;
	wc.lpszClassName=szAppName;
	wc.lpszMenuName=NULL;
	wc.style=CS_HREDRAW|CS_VREDRAW;
	wc.hIcon=NULL;

	fehler=RegisterClass(&wc);
	if(fehler==0)
	{
		MessageBox(0, "Fehler bei RegisterClass()!", "Fehler", MB_ICONERROR|MB_OK);
		return 1;
	}

	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_KEYDOWN:
		{
			switch(wParam)
			{
			case VK_INSERT:
				{
					MSG msg;
					HINSTANCE hInstance_new;
					HWND hWnd_new;
					WNDCLASS wc;
					int iCmdShow;
					int fehler;

					const char szAppName[]="zweites Fenster";

					wc.cbClsExtra=0;
					wc.cbWndExtra=0;
					wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
					wc.hCursor=LoadCursor(NULL, IDI_APPLICATION);
					wc.hInstance=hInstance_new;
					wc.lpfnWndProc=WndProc_new;
					wc.lpszClassName=szAppName;
					wc.lpszMenuName=NULL;
					wc.style=CS_HREDRAW|CS_VREDRAW;
					wc.hIcon=NULL;

					fehler=RegisterClass(&wc);
					if(fehler==0)
					{
						MessageBox(0, "Fehler bei RegisterClass()!", "Fehler", MB_ICONERROR|MB_OK);
						return 1;
					}

					hWnd=CreateWindow(szAppName,
						szAppName,
						WS_OVERLAPPEDWINDOW|WS_VISIBLE,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						NULL,
						NULL,
						hInstance_new,
						NULL);

					ShowWindow(hWnd_new, iCmdShow);
					UpdateWindow(hWnd_new);

					while(GetMessage(&msg, NULL, 0, 0))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					return msg.wParam;
				}
			}
		}
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}
	}
	return DefWindowProc(hWnd, message, wParam, lParam);
}

LRESULT CALLBACK WndProc_new(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}
	}
	return DefWindowProc(hWnd, message, wParam, lParam);
}
geöffnet wird das Fenster bei mir allerdings mit 'Einfügen' statt mit 'F4', was du glaub ich vorhattest. Müsste man aber ja eigentlich recht einfach ändern können.
gruß
bastionmancher
 
Zurück