Форум программистов CodeGuru
14 Август 2018, 17:23:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с отрисовкой битмап в окне.  (Прочитано 21996 раз)
0 Пользователей и 1 Гость смотрят эту тему.
~Virt
Новичок
*
Офлайн Офлайн

Сообщений: 2


Просмотр профиля
« : 05 Декабрь 2009, 22:47:48 »

Доброго времени суток, уважаемые форумчане.
Пишу небольшую прогу по винапи и тут такой облом - не перерисовывается битмап в окне.
Весь уже удолбался, но так и не понял, почему же всеж таки не работает.
Пишу в Visual Studio 2005.
Предполагаю, что вся фишка в WM_PAINT, но, чтобы быстрее создавался проект, кину весь код(главного cpp-файла).
Код:
// GRr.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "GRr.h"
#include <windows.h>

#include <commdlg.h>
#include <tchar.h>
#include <math.h>

#define MAX_LOADSTRING 100
#define NUM 1000
#define TWOPI  (2 * 3.14159)


HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name

static OPENFILENAME ofn;
HANDLE file;
RECT rcPaint;
double scale;
int ImHeight;
int ImWidth;
HBITMAP hBmp;
BITMAP   bmp;

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HWND MyToolBar(HWND hWnd);
LPCTSTR FileOpenDlg (HWND hWnd);
void error(HWND hWnd, int n);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg;
HACCEL hAccelTable;


LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_GRR, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GRR));
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_GRR));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_GRR);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

file=NULL;
rcPaint.bottom=0;
rcPaint.top=0;
rcPaint.left=0;
rcPaint.right=0;
scale=1;
ImHeight=0;
ImWidth=0;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
static HMETAFILE hmf ;
    RECT rc;

static int cxChar, cyChar, Height,Width, cyClient,cxClient, hScroll,vScroll,scrollDelta;
    HBRUSH           hBrush ;
HPEN             hPen;
    HDC              hdc, hMemDC,hDC;
    int              x, y ,i=100;
    PAINTSTRUCT      ps ;
POINT            pt[NUM];
    POINT            pt2[4];

hdc=GetDC(hWnd);
SetBkColor(hdc,TRANSPARENT);

switch (message)
{
    case WM_CREATE:
               return 0 ;
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;

case IDM_FILE_OPEN:
if(file!=NULL){
CloseHandle(file);
file=NULL;
hDC=GetDC(hWnd);
hBrush  = CreateSolidBrush (RGB(15,15,150)) ;
SelectObject(hDC,hBrush);    
hPen = CreatePen(PS_SOLID, 1 ,RGB(255,255,255));
SelectObject(hDC,hPen);
Rectangle (hDC, rcPaint.left, rcPaint.top, rcPaint.right, rcPaint.bottom) ;
DeleteObject(hPen);
DeleteDC(hDC);
FileOpenDlg (hWnd);
}
else FileOpenDlg (hWnd);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break; 
case WM_PAINT:
               hDC = BeginPaint (hWnd, &ps);
//GetObject(hBmp,sizeof(BITMAP),(LPSTR)&bmp);
SetBkColor(hDC,TRANSPARENT);
hMemDC=CreateCompatibleDC(hDC);
SelectObject(hMemDC,hBmp);
StretchBlt( hdc,
0,0,
(int)ImWidth*scale,
(int)ImHeight*scale,
hMemDC,
0,0,
ImWidth,
ImHeight,
SRCCOPY
);
//int i=GetLastError();
DeleteDC(hMemDC);
               EndPaint (hWnd, &ps) ;
   return 0 ;
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;
}
HWND MyToolBar(HWND hWnd){
HWND tH;

return tH;
}
LPCTSTR FileOpenDlg (HWND hWnd)
{
TCHAR buf[512]={0};
LPWSTR FileName=buf;
ofn.lpstrFilter=_T("24-bit BMP picture\0*.bmp");
ofn.lpstrFile=FileName;
ofn.nMaxFile=sizeof(buf)/sizeof(TCHAR);
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner         = hWnd ;
    GetOpenFileName (&ofn) ;
/*if(*ofn.lpstrFile==_T("/0")){
error(_NO_FILE_OPENED_);
return _T("NOT OPEN FILE");
}*/

DWORD dCountR;
BITMAPFILEHEADER bmfileheader;
    BITMAPINFOHEADER bminfoheader;
    DWORD size;
if(NULL!=(file=CreateFile(ofn.lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)))
{
ReadFile(file,&bmfileheader,sizeof(BITMAPFILEHEADER),&dCountR,NULL);
        ReadFile(file,&bminfoheader,sizeof(BITMAPINFOHEADER),&dCountR,NULL);
size=bminfoheader.biSize;
//DWORD buffer[size];

if(bmfileheader.bfType!=0x4d42){
error(hWnd,_NOT_BMP24_);//non fatal -> return;
return _T("BAD PIC");
}
hBmp=(HBITMAP) LoadImageW(NULL,ofn.lpstrFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(hBmp) {
GetObject(hBmp,sizeof(BITMAP),(LPSTR) &bmp);
/*if(bmp.bmHeight>300||bmp.bmWidth>300)
{
error(hWnd,_TOO_LARGE_BMP_);
return _T("BAD PIC");
}*/
rcPaint.bottom=bmp.bmHeight;
rcPaint.right=bmp.bmWidth;

HDC hDc=GetDC(hWnd);
SetBkMode(hDc,TRANSPARENT); //Устанавливаем прозрачный фон
HDC hMemDc = CreateCompatibleDC(hDc); //Создаем контекст в памяти, совместимый с контекстом устройства - в данном случае окна приложение
SelectObject(hMemDc,hBmp); //Выбор битового изображения в контекст памяти
    //BitBlt(hDc,0,0,240,240,hMemDc,0,0,SRCCOPY); //Отрисовка изображения
scale=1;
ImHeight=bmp.bmHeight;
ImWidth=bmp.bmWidth;
StretchBlt(hDc, // контекст для рисования
0,0, // x,y-координата верхнего левого угла области рисования
bmp.bmWidth, // новая ширина изображения
bmp.bmHeight, // новая высота изображения
hMemDc, // идентификатор исходного контекста
0,0, // x,y-координата верхнего левого угла исходной области
bmp.bmWidth, // ширина исходного изображения
bmp.bmHeight, // высота исходного изображения
SRCCOPY); // код растровой операции

//Возврат к исходному состоянию
DeleteDC(hMemDc);
DeleteDC(hDc);
DeleteObject(hBmp);
}
}
return _T("sdfsf");
}
void error(HWND hWnd,int n){
switch(n){
case _NOT_BMP24_:
MessageBox(hWnd,_T("Not a bitmap 24-bit picture. Retry."),_T("Error"),0);
CloseHandle(file);
file=NULL;
break;
case _TOO_LARGE_BMP_:
MessageBox(hWnd,_T("This bmp too large. Retry."),_T("Error"),0);
CloseHandle(file);
file=NULL;
break;
case _NO_FILE_OPENED_:
MessageBox(hWnd,_T("File not choose"),_T("Error"),0);
break;
}
}

Записан
~Virt
Новичок
*
Офлайн Офлайн

Сообщений: 2


Просмотр профиля
« Ответ #1 : 06 Декабрь 2009, 00:39:11 »

В диалоге открытия файла случайно проставил удалять хэндл на битмап.
Всем спасибо за внимание, сорри за потраченное время. Впорос закрыт.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!