Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2011, 02:28   #1
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию Перерисовка окна

Доброго времени суток!

Проблема заключается в том, что я загружаю картинку из bmp. (по клику на кнопку выбираю файл и он грузится)
Затем я пытаюсь послать сообщение, что нужна отрисовка картики на форме, однако ничего такого не происходит... если рисовать сразу после загрузки картинки (в обработчике WM_COMMAND вместо WM_PAINT), то картинка рисуется... только если выбрать новый файл, то новая картинка грузится (проверял по размеру картинки), но не перерисовывается старая...

Код:
LRESULT CALLBACK MainProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	MyBMP bmp;
	char buf[250]="\0";
	HDC hdc;
	PAINTSTRUCT ps;
	int i, j;
	switch(msg)
	{
	case WM_CREATE:
		{
		CreateWindow("BUTTON", "Открыть...", WS_CHILD|WS_VISIBLE, 500, 10, 100, 20, hWnd, (HMENU)0, 0, 0);
		};break;

	case WM_PAINT:
		{	
				bmp.NewMyBMP();
				bmp.LoadBMP(buf);
				if (bmp.height!=0 && bmp.width!=0)
				{
					hdc = BeginPaint(hWnd, &ps);
					for (i=0; i<500; i++)
						for (j=0; j<500; j++)
							SetPixel(hdc, i, j, RGB(0, 0, 0));
					for (i=0; i<bmp.width; i++)
					{
						for (j=0; j<bmp.height; j++)
						{
							SetPixel(hdc, i, j, RGB(bmp.colors[j][i].rgbtRed, bmp.colors[j][i].rgbtGreen, bmp.colors[j][i].rgbtBlue));
						}
					}
					ValidateRect(hWnd, NULL);
					EndPaint(hWnd, &ps);
				}
				
		};break;
	case WM_LBUTTONDOWN:
		{

		};break;

	case WM_COMMAND:
		{
			if (LOWORD(wParam)==0)
			{
				char *fn=NULL;
				fn = OpenFileDlg(hWnd);
				if (fn)
				{
					memset(buf, 0, sizeof(buf));
					i=0;
					int k=0;
					while (fn[i]!='\0')
					{
						if (fn[i] != '\\')
						{
							buf[k]=fn[i];
						}
						else
						{
							buf[k]='/';
							buf[++k]='/';
						}
						k++;
						i++;
					}
					InvalidateRect(hWnd, NULL, TRUE);
					UpdateWindow(hWnd);
				}
			}
		};break;

	case WM_DESTROY:
		{
			PostQuitMessage(0);
		};break;
	default: return DefWindowProc(hWnd, msg, wParam, lParam);
	}
	return 0l;
}
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Старый 10.11.2011, 16:06   #2
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию

помогите кто-нибуть!(
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Старый 10.11.2011, 20:44   #3
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Вот пример загрузки и рисования рисунка в окне:
Код:
#include <windows.h>

#define IdButton1 1

 static LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM); // обработчик сообщений

 static LPCSTR szAppName   = "MyWindow";
 static LPCSTR szClassName = "MyWindowClass";

  int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
 {
   WNDCLASSEX wndclass;
   wndclass.cbSize = sizeof( wndclass);
   wndclass.style = CS_OWNDC;
   wndclass.lpfnWndProc = WndProc;
   wndclass.cbClsExtra = 0;
   wndclass.cbWndExtra = 0;
   wndclass.hInstance = hInstance;
   wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION);
   wndclass.hCursor = LoadCursor( NULL, IDC_ARROW);
   wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
   wndclass.lpszMenuName = NULL;
   wndclass.lpszClassName = szClassName;
   wndclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION);
    if ( !RegisterClassEx( &wndclass))  return -1;

   HWND hWnd = CreateWindowEx( 0, szClassName, szAppName,
      WS_OVERLAPPEDWINDOW |WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    if ( !hWnd) return -1;

   MSG msg = {0};
   while( GetMessage( &msg, NULL, 0, 0))
   {
      TranslateMessage( &msg);
      DispatchMessage( &msg);
   }
   return msg.wParam;
 }

 void DrawBitmap( HDC hdc, HBITMAP hBitmap, int xStart, int yStart)
{
   BITMAP bm;
   HDC hdcMem = CreateCompatibleDC( hdc);
   SelectObject( hdcMem, hBitmap);
   GetObject( hBitmap, sizeof( BITMAP), &bm);
   BitBlt( hdc, xStart, yStart, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
   DeleteDC( hdcMem);
}

 static LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)  // обработчик сообщений
{
   static HINSTANCE hInstance;
   static PAINTSTRUCT ps;
   static HBITMAP hBitmap =0;
    switch( iMsg)
   {
      case WM_CREATE:
         hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
         CreateWindow( "BUTTON", "Открыть...", BS_PUSHBUTTON |WS_CHILD |WS_VISIBLE, 500, 10, 100, 20, hwnd, (HMENU) IdButton1, hInstance, 0);
         return 0;

      case WM_PAINT:
         BeginPaint( hwnd, &ps);
         DrawBitmap( ps.hdc, hBitmap, 0, 0);
         EndPaint( hwnd, &ps);
         return 0;

      case WM_CLOSE:
         DestroyWindow ( hwnd);
         return 0;

      case WM_DESTROY:
         if ( hBitmap) DeleteObject( hBitmap);
         PostQuitMessage( 0);
         return 0;

      case WM_COMMAND:
         if ( LOWORD(wParam) == IdButton1)
         {
            OPENFILENAME ofn;
            ZeroMemory( &ofn, sizeof(ofn));  // очистим структуру
            CHAR fileName [256] ={0};        // очистим имя файла
            ofn.lStructSize = sizeof(ofn);
            ofn.hwndOwner = hwnd;
            ofn.lpstrFile = fileName;
            ofn.lpstrFilter = "BMP files(*.bmp)\0*.bmp\0\0";
            ofn.nFilterIndex = 1;
            ofn.lpstrFileTitle = NULL;
            ofn.nMaxFileTitle = 0;
            ofn.lpstrInitialDir = NULL;
            ofn.lpstrTitle = "Загрузить bmp";
            ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
            ofn.nMaxFile = sizeof( fileName) / sizeof( CHAR);
             if ( GetOpenFileName( &ofn))    // Открытие и создание
             switch ( ofn.nFilterIndex)
            {
               case 1:
                  if ( hBitmap) DeleteObject( hBitmap);
                  hBitmap = (HBITMAP) LoadImage( hInstance, fileName, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
                  InvalidateRect( hwnd, 0, TRUE);
                  break;
            }
         }
         return 0;

      case WM_KEYDOWN:
          switch ( wParam)
         {
            case VK_ESCAPE:
               SendMessage( hwnd, WM_CLOSE, 0, 0L);
               return 0;
         }
         return 0;
      }
      return DefWindowProc( hwnd, iMsg, wParam, lParam);
}
An1ka вне форума Ответить с цитированием
Старый 10.11.2011, 20:54   #4
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию

Спасибо, но я уже нашёл решение... Мб кому интерестно... Минус только есть... долго рисует (но мне важно иметь доступ к растру...)
Код:
int needupd;
MyBMP bmp;
RECT rc;

...

LRESULT CALLBACK MainProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	char buf[250]="\0";
	HDC hdc;
	PAINTSTRUCT ps;
	int i, j;

	switch(msg)
	{
	case WM_CREATE:
		{
			CreateWindow("BUTTON", "Открыть...", WS_CHILD|WS_VISIBLE, 500, 10, 100, 20, hWnd, (HMENU)0, 0, 0);
			needupd=0;
			rc.left=0;
			rc.right=500;
			rc.top=0;
			rc.bottom=500;
		};break;

	case WM_COMMAND:
		{
			if (LOWORD(wParam)==0)
			{
				char *fn=NULL;
				fn = OpenFileDlg(hWnd);
				if (fn)
				{
					memset(buf, 0, sizeof(buf));
					i=0;
					int k=0;
					while (fn[i]!='\0')
					{
						if (fn[i] != '\\')
						{
							buf[k]=fn[i];
						}
						else
						{
							buf[k]='\\';
							buf[++k]='\\';
						}
						k++;
						i++;
					}
					needupd = 1;
					bmp.NewMyBMP();
					bmp.LoadBMP(buf);
					InvalidateRect(hWnd, &rc, true);
				}
			}
		};break;

	case WM_PAINT:
		{
			hdc=BeginPaint(hWnd, &ps);
			if (needupd==1)
			{
				MoveToEx(hdc, 4, 4, 0);
				LineTo(hdc, 4, bmp.height+5);
				LineTo(hdc, bmp.width+5, bmp.height+5);
				LineTo(hdc, bmp.width+5, 4);
				LineTo(hdc, 4, 4);
				for (i=4; i<bmp.width+5; i++)
				{
					for (j=bmp.height+4; j>=5; j--)
					{
						SetPixel(hdc, i, j, RGB(bmp.colors[j-5][i-5].rgbtRed, bmp.colors[j-5][i-5].rgbtGreen, bmp.colors[j-5][i-5].rgbtBlue));
					}
				}
				needupd = 0;
			}
			ValidateRect(hWnd, &rc);
			EndPaint(hWnd, &ps);
		};break;

	case WM_DESTROY:
		{
			PostQuitMessage(0);
		};break;

	default: return DefWindowProc(hWnd, msg, wParam, lParam);
	return 0l;
	}
}
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильная перерисовка окна vasily86 Компоненты Delphi 2 07.07.2011 14:36
Перерисовка окна при момощи InvalidateRect assch Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 01.07.2011 19:49
перерисовка/обновление клиентской области окна ImmortalAlexSan Общие вопросы Delphi 0 09.01.2011 16:19
Перерисовка окна _Dmitry_ Win Api 3 30.03.2010 19:55
C#: перерисовка форми Natok Общие вопросы .NET 9 02.06.2009 20:03