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

Winapi okno potomne i okno rodzica może tu ....

Ostatnio zmodyfikowano 2013-01-23 13:51
Autor Wiadomość
piotrusbor
Temat założony przez niniejszego użytkownika
Winapi okno potomne i okno rodzica może tu ....
» 2013-01-22 14:59:30
Zerknijcie na ten link:
http://www.elektroda.pl/rtvforum/topic2477335.html
Może wy ? Pzdr
P-74673
xevuel
» 2013-01-22 15:03:47
Wyedytuj pierwszy post i opisz swój problem tutaj, nikt nie będzie otwierał kolejnych stron tylko po to żeby zerknąć na czyjś kod.
P-74675
piotrusbor
Temat założony przez niniejszego użytkownika
OK
» 2013-01-22 15:08:55
Tylko, żeby nie było, że zaśmiecam na forach :):)
Witam,
Pytałem już o to na innym forum ale niestety nie uzyskałem satysfakcjonującej mnie odpowiedzi. Dodam że może być to ważne iż piszę programik w VS 2010 EXPRESS.
Mój problem to utworzenie okna dziecka po naciśnięciu buttona w oknie rodzica. Znalazłem całą procedurę tworzenia i co najlepsze wszystko się ładnie kompiluje i działa jak powinno--> Link do postu tylko jest inaczej napisane co pewnie wiąże się z programem w którym było tworzone. Ja u siebie na VS 2010 Exp. mam taki kod, który został wygenerowany przez VS i powiększony nieco przeze mnie. Wygląda to tak:
C/C++
#include "stdafx.h"
#include "jjj.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[ MAX_LOADSTRING ]; // The title bar text
TCHAR szWindowClass[ MAX_LOADSTRING ]; // the main window class name
TCHAR szWindowClassChild[ MAX_LOADSTRING ];
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK WndProcChild( HWND, UINT, WPARAM, LPARAM );
INT_PTR CALLBACK About( HWND, UINT, WPARAM, LPARAM );

int APIENTRY _tWinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow )
{
    UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );
   
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;
   
    // Initialize global strings
    LoadString( hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING );
    LoadString( hInstance, IDC_JJJ, szWindowClass, MAX_LOADSTRING );
    MyRegisterClass( hInstance );
   
    // Perform application initialization:
    if( !InitInstance( hInstance, nCmdShow ) )
    {
        return FALSE;
    }
   
    hAccelTable = LoadAccelerators( hInstance, MAKEINTRESOURCE( IDC_JJJ ) );
   
    // Main message loop:
    while( GetMessage( & msg, NULL, 0, 0 ) )
    {
        if( !TranslateAccelerator( msg.hwnd, hAccelTable, & msg ) )
        {
            TranslateMessage( & msg );
            DispatchMessage( & msg );
        }
    }
   
    return( int ) msg.wParam;
}

ATOM MyRegisterClass( HINSTANCE hInstance )
{
    WNDCLASSEX wcex;
   
    wcex.cbSize = sizeof( WNDCLASSEX );
   
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_JJJ ) );
    wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
    wcex.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wcex.lpszMenuName = MAKEINTRESOURCE( IDC_JJJ );
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon( wcex.hInstance, MAKEINTRESOURCE( IDI_SMALL ) );
   
    return RegisterClassEx( & wcex );
   
    WNDCLASSEX wcex1;
    wcex1.lpfnWndProc = WndProcChild;
    wcex1.cbClsExtra = 0;
    wcex1.cbWndExtra = 0;
    wcex1.hInstance = hInstance;
    wcex1.lpszClassName = szWindowClassChild;
   
    return RegisterClassEx( & wcex );
}

BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
    HWND hWnd, noweOkno;
   
    hInst = hInstance; // Store instance handle in our global variable
   
    hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    0, 0, 300, 200, NULL, NULL, hInstance, NULL );
    noweOkno = CreateWindow( szWindowClassChild, "", WS_OVERLAPPEDWINDOW, 0, 0,
    300, 200, hWnd, NULL, hInst, NULL );
   
    ShowWindow( hWnd, nCmdShow );
    UpdateWindow( hWnd );
   
    return TRUE;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    HWND hRysuj, noweOkno;
   
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
   
    switch( message )
    {
       
    case WM_CREATE:
        hRysuj = CreateWindow( "button", "Rysuj", WS_CHILD | WS_VISIBLE,
        10, 10, 100, 20, hWnd,( HMENU ) 1001, hInst, 0 );
        break;
       
    case WM_COMMAND:
        wmId = LOWORD( wParam );
        wmEvent = HIWORD( wParam );
        // Parse the menu selections:
        switch( wmId )
        {
        case 1001:
            ShowWindow( noweOkno, SW_SHOW );
            break;
        case IDM_ABOUT:
            DialogBox( hInst, MAKEINTRESOURCE( IDD_ABOUTBOX ), hWnd, About );
            break;
        case IDM_EXIT:
            DestroyWindow( hWnd );
            break;
            default:
            return DefWindowProc( hWnd, message, wParam, lParam );
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint( hWnd, & ps );
        // TODO: Add any drawing code here...
        EndPaint( hWnd, & ps );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    return 0;
}

INT_PTR CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
    UNREFERENCED_PARAMETER( lParam );
    switch( message )
    {
    case WM_INITDIALOG:
        return( INT_PTR ) TRUE;
       
    case WM_COMMAND:
        if( LOWORD( wParam ) == IDOK || LOWORD( wParam ) == IDCANCEL )
        {
            EndDialog( hDlg, LOWORD( wParam ) );
            return( INT_PTR ) TRUE;
        }
        break;
    }
    return( INT_PTR ) FALSE;
}

LRESULT CALLBACK WndProcChild( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
   
    switch( message )
    {
    case WM_COMMAND:
        wmId = LOWORD( wParam );
        wmEvent = HIWORD( wParam );
        // Parse the menu selections:
        switch( wmId )
        {
        case IDM_ABOUT:
            DialogBox( hInst, MAKEINTRESOURCE( IDD_ABOUTBOX ), hWnd, About );
            break;
        case IDM_EXIT:
            DestroyWindow( hWnd );
            break;
            default:
            return DefWindowProc( hWnd, message, wParam, lParam );
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint( hWnd, & ps );
        // TODO: Add any drawing code here...
        EndPaint( hWnd, & ps );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    return 0;
}
No i niestety ale nie działa jak powinno, a kompilator wywala błąd
noweOkno 0xcccccccc { unused =??? } HWND__ *
Może wy mi pomożecie, wskażecie błąd ? Nie mam już siły, pomysłu na ten pewnie dość banalny błąd którego nie mogę odszukać......
Błąd wywala w linii 125:127.

P-74676
xevuel
» 2013-01-22 15:12:55
C/C++
return RegisterClassEx( & wcex );

WNDCLASSEX wcex1;
wcex1.lpfnWndProc = WndProcChild;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = 0;
wcex1.hInstance = hInstance;
wcex1.lpszClassName = szWindowClassChild;

return RegisterClassEx( & wcex );
To po return coś jeszcze się wykona? ;)

Jeśli chcesz mieć okno potomne, najprościej będzie stworzyć dialog. Być może do Twoich potrzeb wystarczy też » Kurs WinAPI, C++ » ZaawansowaneMDI lekcja.
P-74677
piotrusbor
Temat założony przez niniejszego użytkownika
» 2013-01-22 15:20:21
Hmmm, no może rzeczywiście.
Co do tego czy będę potrzebował czy nie to nie wiem.
W tym nowym oknie co się narysuję po naciśnięciu buttona, będę musiał pobrać wartości obliczone w oknie głównym i na ich podstawie będzie się rysował wykres funkcji. Więc co mi polecasz ?
P-74680
xevuel
» 2013-01-22 15:23:22
Poczytaj o jednym i o drugim i sam dobierz, co wydaje Ci się bardziej odpowiednie. Ja wybrałbym raczej MDI.
P-74681
piotrusbor
Temat założony przez niniejszego użytkownika
» 2013-01-22 15:26:12
Usunąłem i zrobiłem jedna klasę
C/C++
ATOM MyRegisterClass( HINSTANCE hInstance )
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof( WNDCLASSEX );
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_DZSFGDFGDF ) );
    wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
    wcex.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wcex.lpszMenuName = MAKEINTRESOURCE( IDC_DZSFGDFGDF );
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon( wcex.hInstance, MAKEINTRESOURCE( IDI_SMALL ) );
   
    wcex.cbSize = sizeof( WNDCLASSEX );
    wcex.style = WS_CHILDWINDOW;
    wcex.lpfnWndProc = WndProcChild;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_DZSFGDFGDF ) );
    wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
    wcex.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wcex.lpszMenuName = MAKEINTRESOURCE( IDC_DZSFGDFGDF );
    wcex.lpszClassName = szWindowClassChild;
    wcex.hIconSm = LoadIcon( wcex.hInstance, MAKEINTRESOURCE( IDI_SMALL ) );
    return RegisterClassEx( & wcex );
   
}

Jednak programik tylko się przekompilował bez błędów i nic ;/;/

PS. sorki nie przekompilował się a zatrzymał w miejscu..
P-74682
xevuel
» 2013-01-22 15:30:21
Dwa razy wypełniasz strukturę a tylko raz rejestrujesz klasę...?
P-74683
« 1 » 2
  Strona 1 z 2 Następna strona