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: #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;
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; 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: #define IDD_DODATEK 400 #define IDC_RAMKA 401 #define IDC_PREVIEW 402 #define IDC_IMGSIZE 403
Resource.rc: #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 }
|