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

[C++, WinAPI] CDM_GETFILEPATH nie pobiera ścieżki

Ostatnio zmodyfikowano 2012-11-25 10:24
Autor Wiadomość
berkov
Temat założony przez niniejszego użytkownika
[C++, WinAPI] CDM_GETFILEPATH nie pobiera ścieżki
» 2012-11-24 13:41:19
Witam,

po 24h walki przyszedl czas by sie poddac.
Proboje zmodyfikowac dialog otwarcia pliku aby pokazal minaturke bmp (wedlug kursu WINAPI).
Wszystko dziala jesli sam wpisze na twardo sciezke
filename = "D://bm.bmp";
 - miniaturka sie wtedy pokazuje. Ale przeciez chodzi o to by miniaturka pokazala sie dla wybranego pliku bmp w dialogu.
Jak kurs sugerowal uzylem
SendMessage( hdlg, CDM_GETFILEPATH, MAX_PATH,( LPARAM ) & g_buffer );
 ale choc SendMessage zwraca mi 0 (co ponoc wskazuje ze wszystko poszlo poprawnie) to g_buffer jest nadal pusty. (aha uzylem OFN_EXPLORER)

Probowalem rowniez uzyc odpowiedniej funkcji
CommDlg_OpenSave_GetFilePath( hdlg, & buffer, MAX_PATH );
 i to samo, g_buffer pusty.

Pomyslalem rowniez ze moze nalezy uderzyc do Parenta hdlg zakladajac ze hdlg jest tylko "czyms" co jest "osadzone" na dialogu Otwierania pliku -
SendMessage( GetParent( hdlg ), CDM_GETFILEPATH, MAX_PATH,( LPARAM ) & g_buffer );
Ale choc buffor wtedy nie byl pusty odnosil sie najprawdopodobniej do czegos do czego chyba nie powinien wiec LoadImage wyrzucalo mi blad.

no nic. wklejam kod i prosze o pomoc.

Source.cpp:
C/C++
#include <windows.h>
#include <windowsx.h>
#include "libs.h"


LPSTR klasa1 = "downolny unikatowy tekst";

MSG Komunikat;
HFONT hCzcionka = CreateFont( 14, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, TEXT( "Verdana" ) );



HWND hwnd;

//dialog modyfikowany - procedura hookowa
HWND hKontrOpenHook;
OPENFILENAME ofn2;
HBITMAP g_hBitmap;
LPSTR g_buffer;
HDC g_hDCMem;
bool g_Preview;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
UINT APIENTRY ProceduraHOOK( HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam );



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )

{
   
   
    WNDCLASSEX wc1;
   
    wc1.cbSize = sizeof( WNDCLASSEX );
    wc1.style = CS_DBLCLKS;
    wc1.lpfnWndProc = WndProc;
    wc1.cbClsExtra = 0;
    wc1.cbWndExtra = 0;
    wc1.hInstance = hInstance;
    wc1.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc1.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc1.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc1.lpszMenuName = NULL;
    wc1.lpszClassName = klasa1;
    wc1.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    wc1.hbrBackground = CreateSolidBrush( RGB( 200, 200, 200 ) );
   
    RegisterClassEx( & wc1 );
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, klasa1, "Odrabane okno Łysego", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, hInstance, NULL );
   
    hKontrOpenHook = CreateWindowEx( 0, "BUTTON", "OpenHook", WS_CHILD | WS_VISIBLE,
    10, 10, 80, 30, hwnd,( HMENU ) 518, hInstance, NULL );
    SendMessage( hKontrOpenHook, WM_SETFONT,( WPARAM ) hCzcionka, 0 );
   
   
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Odrabane okno Łysego wcanie nie jest takie odrabane bo go nie ma", "I DUPA", MB_ICONEXCLAMATION );
        return 1;
    }
   
   
    ShowWindow( hwnd, nCmdShow );
   
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
   
    return Komunikat.wParam;
   
   
   
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_COMMAND:
        switch( wParam )
        {
           
        case 518:
            {
                char sNazwaPliku[ MAX_PATH ] = "";
               
                ZeroMemory( & ofn2, sizeof( ofn2 ) );
                ofn2.lStructSize = sizeof( ofn2 );
                ofn2.lpstrFilter = "Bitmapy (*.bmp)\0*.bmp\0Wszystkie pliki\0*.*\0";
                ofn2.nMaxFile = MAX_PATH;
                ofn2.lpstrFile = sNazwaPliku;
                ofn2.lpstrDefExt = "bmp";
                ofn2.lpfnHook = & ProceduraHOOK;
                ofn2.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLETEMPLATE;
               
                ofn2.hInstance = GetModuleHandle( NULL );
                ofn2.lpTemplateName = MAKEINTRESOURCE( IDD_DODATEK );
                GetOpenFileName( & ofn2 );
               
                MessageBox( NULL,( LPCSTR ) ofn2.lpstrFile, "", 0 );
               
            }
           
           
            default:
            break;
        }
        break;
       
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}




UINT APIENTRY ProceduraHOOK( HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam )
{
   
    switch( uiMsg )
    {
    case WM_NOTIFY:
       
        {
           
           
            NMHDR * pnmhdr =( NMHDR * ) lParam;
            OFNOTIFY * ofnot =( OFNOTIFY * ) lParam;
           
            if( pnmhdr->code == CDN_SELCHANGE )
            {
               
                SendMessage( hdlg, CDM_GETFILEPATH, MAX_PATH,( LPARAM ) & g_buffer );
               
                LPSTR filename = g_buffer;
                //filename = "D://bm.bmp";
                if( g_hBitmap ) { DeleteObject( g_hBitmap ); g_hBitmap = NULL; }
                g_hBitmap =( HBITMAP ) LoadImage( GetModuleHandle( NULL ), filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
                HDC hDC = GetDC( hwnd );
                g_hDCMem = CreateCompatibleDC( hDC );
                ReleaseDC( hwnd, hDC );
               
            }
            else if( pnmhdr->code == CDN_FILEOK )
            {
                if( g_hBitmap ) { DeleteObject( g_hBitmap ); g_hBitmap = NULL; }
            }
        }
        break;
    case WM_DESTROY:
        {
            if( g_hBitmap ) { DeleteObject( g_hBitmap ); g_hBitmap = NULL; }
        }
        break;
       
    case WM_COMMAND:
        {
            g_Preview =( IsDlgButtonChecked( hdlg, IDC_PREVIEW ) == BST_CHECKED );
            InvalidateRect( hdlg, NULL, true );
        }
        break;
       
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint( hdlg, & ps );
           
            if( g_Preview && g_hBitmap && g_hDCMem )
            {
                HWND hFrame = GetDlgItem( hdlg, IDC_RAMKA );
               
                RECT rcFrame;
                GetWindowRect( hFrame, & rcFrame );
                int w = rcFrame.right - rcFrame.left;
                int h = rcFrame.bottom - rcFrame.top;
               
                BITMAP bm;
                GetObject( g_hBitmap, sizeof( BITMAP ), & bm );
               
                ScreenToClient( hdlg,( LPPOINT ) & rcFrame );
                ScreenToClient( hdlg,( LPPOINT ) & rcFrame.right );
               
                HBITMAP hbmDefault = SelectBitmap( g_hDCMem, g_hBitmap );
                StretchBlt( hdc, rcFrame.left, rcFrame.top, w, h, g_hDCMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
                SelectBitmap( g_hDCMem, hbmDefault );
            }
           
            EndPaint( hdlg, & ps );
        }
        break;
       
       
       
    }
   
   
    return 0;
}


Aby wszystko bylo jasne libs.h:
C/C++
#define IDD_DODATEK 400
#define IDC_RAMKA 401
#define IDC_PREVIEW 402
#define IDC_IMGSIZE 403

Resource.rc:
C/C++
//Otworz plik w procedurze hakowej (podglad obrazka)
#include <windows.h>
#include "libs.h"

IDD_DODATEK DIALOG 6, 18, 186, 72
STYLE WS_CHILD | WS_CLIPSIBLINGS | DS_3DLOOK | DS_CONTROL
CAPTION "Dialog Title"
FONT 8, "MS Sans Serif"
{
    CONTROL "", IDC_RAMKA, "Static", SS_BLACKFRAME, 6, 6, 54, 60
    AUTOCHECKBOX "Podglad wlaczony", IDC_PREVIEW, 66, 12, 108, 10
    LTEXT "", IDC_IMGSIZE, 66, 48, 90, 12
}
P-69790
xevuel
» 2012-11-24 14:49:45
Jedyne co się rzuca w oczy to brak alokowania pamięci dla g_buffer.
P-69800
berkov
Temat założony przez niniejszego użytkownika
» 2012-11-24 15:14:59
Wiec wrzucilem to:

C/C++
g_buffer =( LPSTR ) GlobalAlloc( GPTR, MAX_PATH );
if( g_buffer == NULL )
MessageBox( NULL, "Ten komunikat sie i tak nie pojawia bo rzekomo g_buffer nie jest pusty",
     "Blad", MB_ICONSTOP );

tuz przed wywolanie
SendMessage( hdlg, CDM_GETFILEPATH, MAX_PATH,( LPARAM ) & g_buffer );

i dalej nic bo choc g_buffer nie jest rowny NULL to jest rowny "" ....lub jak kto woli "\0".
Dalej zadnej sciezki do pliku pochodzacej z CDM_GETFILEPATH nie ma.. jakies inne pomysly???
P-69802
kubawal
» 2012-11-24 15:20:17
Spróbuj zamiast zadeklarować g_buffer jako LPCSTR, a nie LPSTR

@up
nie jest rowny NULL to jest rowny "" ....lub jak kto woli "\0"

NULL to wskaźnik zerowy, nie wskazuje na nic, nawet na "" ani "/0"
P-69804
berkov
Temat założony przez niniejszego użytkownika
» 2012-11-24 15:28:52
OK.. wiec w globalnym definiowaniu zmiennych (na samym poczatku) zmienilem na:
LPCSTR g_buffer;

W procedurze hook na:
C/C++
g_buffer =( LPCSTR ) GlobalAlloc( GPTR, MAX_PATH );

no i oczywiscie mojhe filename musi byc LPSTR wiec zmienilem na:
C/C++
LPSTR filename =( LPSTR ) g_buffer;

i sprawdzalem podczas wykonywania kodu jak zmienia sie wartosc g_buffer.
zarowno jak przed SendMessage tak i po byla rowna "" lub "\0".
Czyli dalej nie dziala.


Czekam na kolejne pomysly.
P-69807
kubawal
» 2012-11-24 15:37:44
Z tego, co wiem, nie musisz wywoływać SendMessage(), GetOpenFileName() samo umieści nazwę pliku w buforze
P-69810
berkov
Temat założony przez niniejszego użytkownika
» 2012-11-24 15:41:55
Niestety nie..
GetOpenFileName() wypelnia strukture OPENFILENAME w ktorej bedzie m.in. sciezka do pliku ale dopiero po zamknieciu dialogu (np przez klikniecie OK). Dopoki dialog jest otwarty struktura jest niedotknieta. a ja potrzebuje dostac sciezke do pliku podczas gdy dialog jest jeszcze otwarty.

P-69811
xevuel
» 2012-11-24 17:23:13
http://forum.4programmers.net/C_i_C++/157138-Problem_z_CDM_GETFILEPATH
Popraw odpowiednio ze wskazówkami wklejkę, która jest tam podana, i powinno działać. Porównaj obydwa kody (Twój i jego) i spróbuj znaleźć, co było błędem.
P-69817
« 1 » 2
  Strona 1 z 2 Następna strona