Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

winapi-otwieranie okna za pomoca nowe okno otwiera nowe okno ale nie otwiera nowego okna pojade kod

Ostatnio zmodyfikowano 2023-08-23 17:59
Autor Wiadomość
inzynier1979
Temat założony przez niniejszego użytkownika
winapi-otwieranie okna za pomoca nowe okno otwiera nowe okno ale nie otwiera nowego okna pojade kod
» 2023-08-23 17:00:56
podaje kod z ktorym mam problem kompiluje sie otwiera sie okno klikam nowe okno otwiera sie w nastepnym  oknie klikam na nowe okno i nie dziala nie otwiera nowego okna
C/C++
#include <windows.h>
#include <tchar.h>
#include <string>
#include <fstream>
#include <locale>
#include <codecvt>
#include <commdlg.h>

#define IDM_FILE_SAVE 4
#define IDM_FILE_OPEN 2
#define IDM_EDIT_COPY 11
#define IDM_FILE_SAVEAS 5
#define IDM_FILE_NEW 6
#define IDM_FILE_NEW_WINDOW 7
#define IDM_EDIT_UNDO 8
#define IDM_EDIT_PASTE 9
#define IDM_EDIT_CUT 10
#define IDM_EDIT_SELECTALL 11
#define IDM_EDIT_WRAP 12
#define IDM_FORMAT_FONT 13
#define IDM_EDIT 14
#define IDM_EDIT_SELECTALL_MAIN 15
#define IDM_VIEW_ZOOM_IN 16
HWND hwndEditNoweOkno = NULL;
HWND hwndEdit = NULL;
bool isTextWrapped = false;
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
void CreateNewWindow();

TCHAR szClassName[ ] = _T( "CodeBlocksWindowsApp" );

int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow )
{
   
   
HWND hwnd;
   
MSG messages;
   
WNDCLASSEX wincl;
   
   
wincl.cbSize = sizeof( WNDCLASSEX );
   
wincl.style = CS_DBLCLKS;
   
wincl.lpfnWndProc = WindowProcedure;
   
wincl.cbClsExtra = 0;
   
wincl.cbWndExtra = 0;
   
wincl.hInstance = hThisInstance;
   
wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION );
   
wincl.hCursor = LoadCursor( NULL, IDC_ARROW );
   
wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND;
   
wincl.lpszMenuName = NULL;
   
wincl.lpszClassName = szClassName;
   
wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
   
if( !RegisterClassEx( & wincl ) )
       
 return 0;
   
   
hwnd = CreateWindowEx(
   
0,
   
szClassName,
   
_T( "notatnik alfa 1" ),
   
WS_OVERLAPPEDWINDOW,
   
CW_USEDEFAULT,
   
CW_USEDEFAULT,
   
800,
   
600,
   
HWND_DESKTOP,
   
NULL,
   
hThisInstance,
   
NULL
    );
   
   
HMENU hMenu = CreateMenu();
   
HMENU hFileMenu = CreateMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hFileMenu, _T( "Plik" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_NEW, _T( "Nowy" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_NEW_WINDOW, _T( "Nowe okno" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_OPEN, _T( "Otworz" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_SAVE, _T( "Zapisz" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_SAVEAS, _T( "Zapisz jako" ) );
   
HMENU hEditMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hEditMenu, _T( "Edycja" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_UNDO, _T( "Cofnij" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_COPY, _T( "Kopiuj" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_PASTE, _T( "Wklej" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_CUT, _T( "Wytnij" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_SELECTALL_MAIN, _T( "Zaznacz wszystko" ) );
   
   
HMENU hFormatMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hFormatMenu, _T( "Format" ) );
   
AppendMenu( hFormatMenu, MF_STRING, IDM_EDIT_WRAP, _T( "Zawijanie wierszy" ) );
   
AppendMenu( hFormatMenu, MF_STRING, IDM_FORMAT_FONT, _T( "Czcionka" ) );
   
HMENU hViewMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hViewMenu, _T( "Widok" ) );
   
AppendMenu( hViewMenu, MF_STRING, IDM_VIEW_ZOOM_IN, _T( "Powiekszanie" ) );
   
   
HMENU hHelpMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hHelpMenu, _T( "Pomoc" ) );
   
   
SetMenu( hwnd, hMenu );
   
   
hwndEditNoweOkno = CreateWindowEx(
   
WS_EX_CLIENTEDGE,
   
_T( "EDIT" ),
   
NULL,
   
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
   
0,
   
0,
   
800,
   
600,
   
hwnd,
   
( HMENU ) IDM_EDIT,
   
hThisInstance,
   
NULL
    );
   
   
ShowWindow( hwnd, nCmdShow );
   
   
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_COMMAND:
       
switch( LOWORD( wParam ) )
       
{
       
case IDM_FILE_NEW_WINDOW:
           
CreateNewWindow();
           
break;
       
case IDM_EDIT_CUT:
           
{
               
SendMessage( hwndEdit, WM_CUT, 0, 0 );
           
}
           
break;
       
case IDM_FORMAT_FONT:
           
{
               
CHOOSEFONT cf;
               
LOGFONT lf;
               
HFONT currentFont =( HFONT ) SendMessage( hwndEdit, WM_GETFONT, 0, 0 );
               
               
GetObject( currentFont, sizeof( LOGFONT ), & lf );
               
               
ZeroMemory( & cf, sizeof( cf ) );
               
cf.lStructSize = sizeof( CHOOSEFONT );
               
cf.hwndOwner = hwnd;
               
cf.lpLogFont = & lf;
               
cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_INITTOLOGFONTSTRUCT;
               
               
if( ChooseFont( & cf ) )
               
{
                   
HFONT newFont = CreateFontIndirect( & lf );
                   
SendMessage( hwndEdit, WM_SETFONT,( WPARAM ) newFont, TRUE );
               
}
            }
           
break;
           
           
           
       
case IDM_FILE_NEW:
           
SendMessage( hwndEdit, WM_SETTEXT, NULL,( LPARAM ) _T( "" ) );
           
break;
       
case IDM_EDIT_UNDO:
           
{
               
SendMessage( hwndEdit, EM_UNDO, 0, 0 );
           
}
           
break;
       
case IDM_EDIT_SELECTALL_MAIN:
           
SendMessage( hwndEdit, EM_SETSEL, 0, - 1 );
           
break;
           
       
case IDM_FILE_OPEN:
           
{
               
OPENFILENAME ofn;
               
TCHAR szFileName[ MAX_PATH ] = { 0 };
               
TCHAR szFilter[ ] = _T( "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0" );
               
               
ZeroMemory( & ofn, sizeof( ofn ) );
               
ofn.lStructSize = sizeof( ofn );
               
ofn.hwndOwner = hwnd;
               
ofn.lpstrFilter = szFilter;
               
ofn.lpstrFile = szFileName;
               
ofn.nMaxFile = MAX_PATH;
               
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
               
               
if( GetOpenFileName( & ofn ) )
               
{
                   
std::wifstream file( ofn.lpstrFile );
                   
if( file.is_open() )
                   
{
                       
file.imbue( std::locale( file.getloc(), new std::codecvt_utf8_utf16 < wchar_t > ) );
                       
std::wstring fileContent(( std::istreambuf_iterator < wchar_t >( file ) ), std::istreambuf_iterator < wchar_t >() );
                       
SendMessage( hwndEdit, WM_SETTEXT, NULL,( LPARAM ) fileContent.c_str() );
                       
file.close();
                   
}
                   
else
                   
{
                       
MessageBox( hwnd, _T( "Failed to open file!" ), _T( "Error" ), MB_OK | MB_ICONERROR );
                   
}
                }
            }
           
break;
           
       
case IDM_FILE_SAVE:
           
{
               
OPENFILENAME ofn;
               
TCHAR szFile[ 260 ] = { 0 };
               
               
ZeroMemory( & ofn, sizeof( ofn ) );
               
ofn.lStructSize = sizeof( ofn );
               
ofn.hwndOwner = hwnd;
               
ofn.lpstrFilter = _T( "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0" );
               
ofn.lpstrFile = szFile;
               
ofn.nMaxFile = sizeof( szFile );
               
ofn.Flags = OFN_OVERWRITEPROMPT;
               
               
if( GetSaveFileName( & ofn ) )
               
{
                   
int textLength = SendMessage( hwndEdit, WM_GETTEXTLENGTH, 0, 0 );
                   
std::wstring buffer( textLength + 1, L'\0' );
                   
SendMessage( hwndEdit, WM_GETTEXT, textLength + 1,( LPARAM ) buffer.data() );
                   
                   
std::wofstream file( ofn.lpstrFile );
                   
if( file.is_open() )
                   
{
                       
file.imbue( std::locale( file.getloc(), new std::codecvt_utf8_utf16 < wchar_t > ) );
                       
file << buffer;
                       
file.close();
                       
MessageBox( hwnd, _T( "Plik został zapisany pomyślnie!" ), _T( "Sukces" ), MB_OK );
                   
}
                   
else
                   
{
                       
MessageBox( hwnd, _T( "Błąd podczas zapisywania pliku!" ), _T( "Błąd" ), MB_OK | MB_ICONERROR );
                   
}
                }
            }
           
break;
       
case IDM_FILE_SAVEAS:
           
{
               
OPENFILENAME ofn;
               
TCHAR szFile[ 260 ] = { 0 };
               
               
ZeroMemory( & ofn, sizeof( ofn ) );
               
ofn.lStructSize = sizeof( ofn );
               
ofn.hwndOwner = hwnd;
               
ofn.lpstrFilter = _T( "All Files (*.*)\0*.*\0" );
               
               
ofn.lpstrFile = szFile;
               
ofn.nMaxFile = sizeof( szFile );
               
ofn.Flags = OFN_OVERWRITEPROMPT;
               
               
if( GetSaveFileName( & ofn ) )
               
{
                   
int textLength = SendMessage( hwndEdit, WM_GETTEXTLENGTH, 0, 0 );
                   
std::wstring buffer( textLength + 1, L'\0' );
                   
SendMessage( hwndEdit, WM_GETTEXT, textLength + 1,( LPARAM ) buffer.data() );
                   
                   
std::wofstream file( ofn.lpstrFile );
                   
if( file.is_open() )
                   
{
                       
file.imbue( std::locale( file.getloc(), new std::codecvt_utf8_utf16 < wchar_t > ) );
                       
file << buffer;
                       
file.close();
                       
MessageBox( hwnd, _T( "Plik został zapisany pomyślnie!" ), _T( "Sukces" ), MB_OK );
                   
}
                   
else
                   
{
                       
MessageBox( hwnd, _T( "Błąd podczas zapisywania pliku!" ), _T( "Błąd" ), MB_OK | MB_ICONERROR );
                   
}
                }
            }
           
break;
           
       
case IDM_EDIT_COPY:
           
SendMessage( hwndEdit, WM_COPY, 0, 0 );
           
break;
           
       
case IDM_EDIT_PASTE:
           
SendMessage( hwndEdit, WM_PASTE, 0, 0 );
           
break;
       
case IDM_EDIT_WRAP:
           
{
               
isTextWrapped = !isTextWrapped; // Zmień stan zawijania tekstu
               
               
DWORD wrapStyle = isTextWrapped ? WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_HSCROLL
                : WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL;
               
               
SetWindowLongPtr( hwndEdit, GWL_STYLE, wrapStyle );
               
SetWindowPos( hwndEdit, NULL, 0, 0, 800, 600, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED );
           
}
           
break;
           
           
           
default:
           
return DefWindowProc( hwnd, message, wParam, lParam );
       
}
       
break;
       
   
case WM_CREATE:
       
hwndEdit = CreateWindowEx(
       
WS_EX_CLIENTEDGE,
       
_T( "EDIT" ),
       
NULL,
       
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
       
0,
       
0,
       
800,
       
600,
       
hwnd,
       
( HMENU ) IDM_EDIT,
       
GetModuleHandle( NULL ),
       
NULL
        );
       
break;
       
   
case WM_DESTROY:
       
PostQuitMessage( 0 );
       
break;
       
       
default:
       
return DefWindowProc( hwnd, message, wParam, lParam );
   
}
   
   
return 0;
}

void CreateNewWindow()
{
   
HINSTANCE hInstance = GetModuleHandle( NULL );
   
   
WNDCLASSEX wincl;
   
wincl.cbSize = sizeof( WNDCLASSEX );
   
wincl.style = CS_DBLCLKS;
   
wincl.lpfnWndProc = WindowProcedure;
   
wincl.cbClsExtra = 0;
   
wincl.cbWndExtra = 0;
   
wincl.hInstance = hInstance;
   
wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION );
   
wincl.hCursor = LoadCursor( NULL, IDC_ARROW );
   
wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND;
   
wincl.lpszMenuName = NULL;
   
wincl.lpszClassName = _T( "NewCodeBlocksWindowsApp" );
   
wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
   
if( !RegisterClassEx( & wincl ) )
       
 return;
   
   
HWND hwndEditNoweOkno = CreateWindowEx(
   
0,
   
wincl.lpszClassName,
   
_T( "notatnik alfa 1" ),
   
WS_OVERLAPPEDWINDOW,
   
CW_USEDEFAULT,
   
CW_USEDEFAULT,
   
800,
   
600,
   
NULL,
   
NULL,
   
hInstance,
   
NULL
    );
   
   
HMENU hMenu = CreateMenu();
   
HMENU hFileMenu = CreateMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hFileMenu, _T( "Plik" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_NEW, _T( "Nowy" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_NEW_WINDOW, _T( "Nowe okno" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_OPEN, _T( "Otwórz" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_SAVE, _T( "Zapisz" ) );
   
AppendMenu( hFileMenu, MF_STRING, IDM_FILE_SAVEAS, _T( "Zapisz jako" ) );
   
HMENU hEditMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hEditMenu, _T( "Edycja" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_UNDO, _T( "Cofnij" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_COPY, _T( "Kopiuj" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_PASTE, _T( "Wklej" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_CUT, _T( "Wytnij" ) );
   
AppendMenu( hEditMenu, MF_STRING, IDM_EDIT_SELECTALL_MAIN, _T( "Zaznacz wszystko" ) );
   
   
HMENU hFormatMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hFormatMenu, _T( "Format" ) );
   
AppendMenu( hFormatMenu, MF_STRING, IDM_EDIT_WRAP, _T( "Zawijanie wierszy" ) );
   
AppendMenu( hFormatMenu, MF_STRING, IDM_FORMAT_FONT, _T( "Czcionka" ) );
   
HMENU hViewMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hViewMenu, _T( "Widok" ) );
   
   
HMENU hHelpMenu = CreatePopupMenu();
   
AppendMenu( hMenu, MF_POPUP,( UINT_PTR ) hHelpMenu, _T( "Pomoc" ) );
   
   
SetMenu( hwndEditNoweOkno, hMenu );
   
   
CreateWindowEx(
   
WS_EX_CLIENTEDGE,
   
_T( "EDIT" ),
   
NULL,
   
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
   
0,
   
0,
   
800,
   
600,
   
hwndEditNoweOkno,
   
( HMENU ) IDM_EDIT,
   
GetModuleHandle( NULL ),
   
NULL
    );
   
   
ShowWindow( hwndEditNoweOkno, SW_SHOW );
}
P-180329
pekfos
» 2023-08-23 17:59:03
Po co rejestrujesz nową klasę okna w CreateNewWindow()? Działa tylko raz, bo nazwa jest zajęta po utworzeniu pierwszego okna, a dałeś inną nazwę więc przynajmniej ten jeden raz działa. Niczego nie zmieniasz, to użyj tej samej klasy co dla pierwszego okna aplikacji.
C/C++
void CreateNewWindow()
{
   
HINSTANCE hInstance = GetModuleHandle( NULL );
   
   
HWND hwndEditNoweOkno = CreateWindowEx(
   
0,
   
szClassName,
   
_T( "notatnik alfa 1" ),
   
WS_OVERLAPPEDWINDOW,
   
CW_USEDEFAULT,
   
CW_USEDEFAULT,
   
800,
   
600,
   
NULL,
   
NULL,
   
hInstance,
   
NULL
    );
P-180330
« 1 »
  Strona 1 z 1