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

[C++][WinApi] Otwarcie głównego okna programu

Ostatnio zmodyfikowano 2013-12-30 00:20
Autor Wiadomość
AssSoft
Temat założony przez niniejszego użytkownika
[C++][WinApi] Otwarcie głównego okna programu
» 2013-12-29 23:20:31
Witam, od niedawna uczę się WinApi, postanowiłem zrobić coś praktycznego. Konkretniej jest to notatnik.

W pewnym momencie natrafiłem na dość dziwny problem, otóż mimo iż program poprawnie się kompilował uruchamiał się "ucięty". Dodałem odpowiednią instrukcję, aby uruchamiał się zmaksymalizowany, dopiero wtedy zrozumiałem na czym polegał problem.
Wszystkie kontrolki były na miejscu, jednak nie było głównego okna programu. Program odpalał się bez nazwy, wyłączać trzeba go za pomocą menadżera zadań.
W skrócie wygląda to tak jakby okno programu po prostu się nie pojawiało.

Aby lepiej zobrazować problem zrobiłem Zrzut ekranu za pomocą darmowego programu do tego przeznaczonego.
Można go zobaczyć [tu href="http://s29.postimg.org/40b586skn/2013_12_29_22h42_23.png"]

Do tego dołączam oczywiście kod programu:
C/C++
#include <windows.h>
#include <fstream>
#include <HEADSSsnote.hpp>
#define ID_p1 1
#define ID_p2 2
#define ID_p3 3
#define ID_p4 4
#define ID_p5 5
#define ID_p6 6
#define ID_p7 7
#define ID_p8 8
using namespace std;
BITMAP bmInfo;
WIN32_FIND_DATA File_Data;
HWND hText;
MSG Komunikat;
DWORD dlugosc;
LPSTR Bufor;
LPSTR Bufor2;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
HWND hp1;
HWND hp2;
HWND hp3;
HWND hp4;
HWND hp5;
HWND hp6;
HWND hp7;
HWND hp8;
HBITMAP hmbObraz;
HDC hdcNowy;
HDC hdc;
int odp;
string zaw;
bool f1 = 0;
fstream zap;
void start()
{
    if( FindFirstFile( TEXT( "C:/programs" ), & File_Data ) == INVALID_HANDLE_VALUE )
    {
        CreateDirectoryA( "C:/programs", NULL );
    }
    if( FindFirstFile( TEXT( "C:/programs/SimpleNote" ), & File_Data ) == INVALID_HANDLE_VALUE )
    {
        CreateDirectoryA( "C:/programs/SimpleNote", NULL );
    }
    if( FindFirstFile( TEXT( "C:/programs/SimpleNote/save1.txt" ), & File_Data ) == INVALID_HANDLE_VALUE )
    {
        zap.open( "C:/programs/SimpleNote/save1.txt", ios::out );
        zap << "";
        zap.close();
    }
    if( FindFirstFile( TEXT( "C:/programs/SimpleNote/save2.txt" ), & File_Data ) == INVALID_HANDLE_VALUE )
    {
        zap.open( "C:/programs/SimpleNote/save2.txt", ios::out );
        zap << "";
        zap.close();
    }
    if( FindFirstFile( TEXT( "C:/programs/SimpleNote/save3.txt" ), & File_Data ) == INVALID_HANDLE_VALUE )
    {
        zap.open( "C:/programs/SimpleNote/save3.txt", ios::out );
        zap << "";
        zap.close();
    }
    if( FindFirstFile( TEXT( "C:/programs/SimpleNote/save4.txt" ), & File_Data ) == INVALID_HANDLE_VALUE )
    {
        zap.open( "C:/programs/SimpleNote/save4.txt", ios::out );
        zap << "";
        zap.close();
    }
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    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 )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = TEXT( "Klasa Okienka" );
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HWND hwnd;
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT( "Klasa Okienka" ), "SimpleNote", WS_OVERLAPPEDWINDOW | WS_MAXIMIZE,
    CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
   
    hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
    WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 1, 70, 1050, 800, hwnd, NULL, hInstance, NULL );
   
    hp1 = CreateWindowEx( 0, "BUTTON", "Zapisz w slot1", WS_CHILD | WS_VISIBLE,
    5, 5, 150, 30, hwnd,( HMENU ) ID_p1, hInstance, NULL );
    hp2 = CreateWindowEx( 0, "BUTTON", "Zapisz w slot2", WS_CHILD | WS_VISIBLE,
    156, 5, 150, 30, hwnd,( HMENU ) ID_p2, hInstance, NULL );
    hp3 = CreateWindowEx( 0, "BUTTON", "Zapisz w slot3", WS_CHILD | WS_VISIBLE,
    307, 5, 150, 30, hwnd,( HMENU ) ID_p3, hInstance, NULL );
    hp4 = CreateWindowEx( 0, "BUTTON", "Zapisz w slot4", WS_CHILD | WS_VISIBLE,
    458, 5, 150, 30, hwnd,( HMENU ) ID_p4, hInstance, NULL );
   
    hp5 = CreateWindowEx( 0, "BUTTON", "Wczytaj slot1", WS_CHILD | WS_VISIBLE,
    5, 36, 150, 30, hwnd,( HMENU ) ID_p5, hInstance, NULL );
    hp6 = CreateWindowEx( 0, "BUTTON", "Wczytaj slot2", WS_CHILD | WS_VISIBLE,
    156, 36, 150, 30, hwnd,( HMENU ) ID_p6, hInstance, NULL );
    hp7 = CreateWindowEx( 0, "BUTTON", "Wczytaj slot3", WS_CHILD | WS_VISIBLE,
    307, 36, 150, 30, hwnd,( HMENU ) ID_p7, hInstance, NULL );
    hp8 = CreateWindowEx( 0, "BUTTON", "Wczytaj slot4", WS_CHILD | WS_VISIBLE,
    458, 36, 150, 30, hwnd,( HMENU ) ID_p8, hInstance, NULL );
   
    hdc = GetDC( hwnd );
    hmbObraz =( HBITMAP ) LoadImage( NULL, "C:/programs/SimpleNote/DATA/Snote_mainimage.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    hdcNowy = CreateCompatibleDC( hdc );
    SelectObject( hdcNowy, hmbObraz );
    GetObject( hmbObraz, sizeof( bmInfo ), & bmInfo );
    hdc = GetDC( hwnd );
    BitBlt( hdc, 1, 836, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY );
    ReleaseDC( hwnd, hdc );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_PAINT:
        PAINTSTRUCT ps; // deklaracja struktury
        hdc = BeginPaint( hwnd, & ps );
        hmbObraz =( HBITMAP ) LoadImage( NULL, "C:/programs/SimpleNote/DATA/Snote_mainimage.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
        hdcNowy = CreateCompatibleDC( hdc );
        SelectObject( hdcNowy, hmbObraz );
        GetObject( hmbObraz, sizeof( bmInfo ), & bmInfo );
        BitBlt( hdc, 1, 871, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY );
        ReleaseDC( hwnd, hdc );
        EndPaint( hwnd, & ps ); // zwalniamy hdc
        break;
    case WM_COMMAND:
        dlugosc = GetWindowTextLength( hText );
        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
        GetWindowText( hText, Bufor, dlugosc + 1 );
        switch( wParam )
        {
        case ID_p1:
           
            start();
            zap.open( "C:/programs/SimpleNote/save1.txt", ios::in );
            zap >> zaw;
            if( zaw.length() > 1 )
            {
                odp = MessageBox( NULL, TEXT( "W slocie 1 znajduje się już tekst. Czy chcesz nadpisać?" ), TEXT( "Nadpisywanie" ), MB_YESNO | MB_ICONQUESTION );
                if( odp == IDNO )
                {
                    break;
                }
            }
            zap.close();
            zap.open( "C:/programs/SimpleNote/save1.txt", ios::out );
            zap << Bufor;
            zap.close();
            MessageBox( NULL, TEXT( "Zakończono zapisywanie" ), TEXT( "Informacja" ), MB_OK | MB_ICONINFORMATION );
            break;
        case ID_p2:
            start();
            zap.open( "C:/programs/SimpleNote/save2.txt", ios::in );
            zap >> zaw;
            if( zaw.length() > 1 )
            {
                odp = MessageBox( NULL, TEXT( "W slocie 2 znajduje się już tekst. Czy chcesz nadpisać?" ), TEXT( "Nadpisywanie" ), MB_YESNO | MB_ICONQUESTION );
                if( odp == IDNO )
                {
                    break;
                }
            }
            zap.close();
            zap.open( "C:/programs/SimpleNote/save2.txt", ios::out );
            zap << Bufor;
            zap.close();
            MessageBox( NULL, TEXT( "Zakończono zapisywanie" ), TEXT( "Informacja" ), MB_OK | MB_ICONINFORMATION );
            break;
        case ID_p3:
            start();
            zap.open( "C:/programs/SimpleNote/save3.txt", ios::in );
            zap >> zaw;
            if( zaw.length() > 1 )
            {
                odp = MessageBox( NULL, TEXT( "W slocie 3 znajduje się już tekst. Czy chcesz nadpisać?" ), TEXT( "Nadpisywanie" ), MB_YESNO | MB_ICONQUESTION );
                if( odp == IDNO )
                {
                    break;
                }
            }
            zap.close();
            zap.open( "C:/programs/SimpleNote/save3.txt", ios::out );
            zap << Bufor;
            zap.close();
            MessageBox( NULL, TEXT( "Zakończono zapisywanie" ), TEXT( "Informacja" ), MB_OK | MB_ICONINFORMATION );
            break;
        case ID_p4:
            start();
            zap.open( "C:/programs/SimpleNote/save4.txt", ios::in );
            zap >> zaw;
            if( zaw.length() > 1 )
            {
                odp = MessageBox( NULL, TEXT( "W slocie 4 znajduje się już tekst. Czy chcesz nadpisać?" ), TEXT( "Nadpisywanie" ), MB_YESNO | MB_ICONQUESTION );
                if( odp == IDNO )
                {
                    break;
                }
            }
            zap.close();
            zap.open( "C:/programs/SimpleNote/save4.txt", ios::out );
            zap << Bufor;
            zap.close();
            MessageBox( NULL, TEXT( "Zakończono zapisywanie" ), TEXT( "Informacja" ), MB_OK | MB_ICONINFORMATION );
            break;
        case ID_p5:
            zap.open( "C:/programs/SimpleNote/save1.txt", ios::in );
            zap >> Bufor;
            zap.close();
            SetWindowText( hText, Bufor );
            break;
        case ID_p6:
            zap.open( "C:/programs/SimpleNote/save2.txt", ios::in );
            zap >> Bufor;
            zap.close();
            SetWindowText( hText, Bufor );
            break;
        case ID_p7:
            zap.open( "C:/programs/SimpleNote/save3.txt", ios::in );
            zap >> Bufor;
            zap.close();
            SetWindowText( hText, Bufor );
            break;
        case ID_p8:
            zap.open( "C:/programs/SimpleNote/save4.txt", ios::in );
            zap >> Bufor;
            zap.close();
            SetWindowText( hText, Bufor );
            break;
            default:
            return DefWindowProc( hwnd, msg, wParam, lParam );
        }
       
        return 0;
    }
}
w "HEADSSsnote.hpp" Znają się definicje 3 nieistotnych dla aplikacji funkcji, które dołączam do większości moich programów ( Są to funkcje zastępujące "Sleep()" i "sleep()"

Jeśli ktoś chce wypróbować samemu tą aplikacje to obrazek ( na razie tylko tymczasowy ) można znaleźć [tu href="http://s22.postimg.org/49s2jnn4x/Snote_mainimage.png"].
Dodatkowo dołączam log kompilacji.

Kompilator: TDM-GCC 4.7.1 64-bit Release
Building Makefile "C:\projekty\SimpleNote\Makefile.win"
Wykonywanie  make...
mingw32-make.exe -f "C:\projekty\SimpleNote\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/projekty/SimpleNote" -g3

g++.exe -c "../../folder c++/Headers_file/WAITTIME.cpp" -o "../../folder c++/Headers_file/WAITTIME.o" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/projekty/SimpleNote" -g3

g++.exe main.o "../../folder c++/Headers_file/WAITTIME.o" -o SimpleNote.exe -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -mwindows -g3

Wykonanie zakończone
Kompilacja zakończona sukcesem

Z góry dziękuję za pomoc!

P.S - To mój pierwszy post więc nie wiem czy w pełni poprawnie go wykonałem.
P-100592
Monika90
» 2013-12-30 00:10:39
Zachowanie tego programu jest niezdefiniowane, dlatego że zapomniałeś napisać
return
 w funkcji WndProc. A raczej napisałeś
return DefWindowProc( hwnd, msg, wParam, lParam );
, ale w złym miejscu. Co mnie zresztą nie dziwi, bo w tak długiej i zagmatwanej funkcji łatwo o pomyłkę, powinieneś podzielić ją na kilka mniejszych.
P-100600
AssSoft
Temat założony przez niniejszego użytkownika
» 2013-12-30 00:20:06
Fakt, powinienem podzielić ją na kilka części.
W czasie operowania nad switch (wParam) musiałem coś źle wkleić ( Zwykle, kiedy korzystam z niemal identycznych operacji w dwóch miejscach kopiuje ich część, aby zaoszczędzić czas. ).

Dziękuję za pomoc, wszystko działa jak należy
P-100601
« 1 »
  Strona 1 z 1