Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]открытие фаила битового 
:(
    Опции темы
rthsobakas
Дата 7.5.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



нужно открыть графических файл битового формата.
вот есть код
Код

/*---------------------------------------------------
   BLOKOUT2.C -- Mouse Button & Capture Demo Program
                 (c) Charles Petzold, 1996
  ---------------------------------------------------*/

//-------------------------------------------------------------
// Подключение заголовочных файлов
//-------------------------------------------------------------
#include <windows.h>
#include <stdlib.h>
#include "Laba7.h"

//-------------------------------------------------------------
// Прототипы функций
//-------------------------------------------------------------
LRESULT CALLBACK FrameWndProc  (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK EllipseWndProc  (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK MetaWndProc   (HWND, UINT, WPARAM, LPARAM) ;
BOOL    CALLBACK CloseEnumProc (HWND, LPARAM) ;       

static HMETAFILE hmf;
static char      szFileName[] = "metafile.mtf";

//--------------------------------------------------------------
// Глобальные переменные
//--------------------------------------------------------------
char      szFrameClass[] = "MdiFrame" ;
char      szClass[]  = "MdiNewEllipseChild" ;
char      szMetaClass[] = "MdiOpenChild" ;
   BOOL  fBlocking, fValidBox ;
      POINT ptBeg, ptEnd, ptBoxBeg, ptBoxEnd ;
      HWND      hwndClient, hwndFrame ;

    HDC        hdcMeta;
HINSTANCE hInst ;
HMENU     hMenuInit, hMenuEllipse, hMenuMeta;

//--------------------------------------------------------------
// Регистрация классов главного и дочерних окон
//--------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
     {
     HACCEL      hAccel ;
     HWND        hwndFrame, hwndClient ;
     MSG         msg ;
     WNDCLASSEX  wndclass ;

     hInst = hInstance ;

     if (!hPrevInstance) 
          {   
          // Регистрация главного окна
          wndclass.cbSize        = sizeof (wndclass) ;
          wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
          wndclass.lpfnWndProc   = FrameWndProc ;
          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_APPWORKSPACE + 1) ;
          wndclass.lpszMenuName  = NULL ;
          wndclass.lpszClassName = szFrameClass ;
          wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;

          RegisterClassEx (&wndclass) ;
                    
          // Регистрация окна "NewEllipse"
          /*wndclass.cbSize        = sizeof (wndclass) ;
          wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
          wndclass.lpfnWndProc   = EllipseWndProc ;
          wndclass.cbClsExtra    = 0 ;         
          wndclass.cbWndExtra    = sizeof (HANDLE) ;   //резервируют дополнительную область памяти       
          wndclass.hInstance     = hInstance ;
          wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
          wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
          wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
          wndclass.lpszMenuName  = NULL ;
          wndclass.lpszClassName = szClass ;
          wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;

          RegisterClassEx (&wndclass) ;*/

          // Регистрация окна "The Current Metafile"
          wndclass.cbSize        = sizeof (wndclass) ;
          wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
          wndclass.lpfnWndProc   = MetaWndProc ;
          wndclass.cbClsExtra    = 0 ;
          wndclass.cbWndExtra    = sizeof (HANDLE) ;//резервируют дополнительную область памяти
          wndclass.hInstance     = hInstance ;
          wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
          wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
          wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
          wndclass.lpszMenuName  = NULL ;
          wndclass.lpszClassName = szMetaClass ;
          wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;

          RegisterClassEx (&wndclass) ;
          }

     // Загрузка трех меню и сохранение их описателей в глобальных 
     // переменных
     hMenuInit  = LoadMenu (hInst, "MdiMenuInit") ;
     //hMenuEllipse = LoadMenu (hInst, "MdiMenuEllipse") ;
     hMenuMeta  = LoadMenu (hInst, "MdiMenuMeta") ;
       
     // Загрузка таблицы горячих клавиш
     hAccel = LoadAccelerators (hInst, "MdiAccel") ;

     // Создание главного окна
     hwndFrame = CreateWindow (szFrameClass, "Laba7",
                               WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               NULL, hMenuInit, hInstance, NULL) ;

     hwndClient = GetWindow (hwndFrame, GW_CHILD) ;

     ShowWindow (hwndFrame, iCmdShow) ;
     UpdateWindow (hwndFrame) ;

     // Цикл обработки сообщений
     while (GetMessage (&msg, NULL, 0, 0))
          {
          if (!TranslateMDISysAccel (hwndClient, &msg) &&//преобразует любые комбинации клавиш, кот могут соответствовать
                                                            //специальным быстрым клавишам MDI в сообщение WM_SYSCOMMAND.
              !TranslateAccelerator (hwndFrame, hAccel, &msg))
               {
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
               }
          }

     // Освобождение памяти, занимаемой меню
     //DestroyMenu (hMenuEllipse) ;
     DestroyMenu (hMenuMeta) ;

     return msg.wParam ;
     }

//----------------------------------------------------------------
// Оконная процедура главного окна
//----------------------------------------------------------------
LRESULT CALLBACK FrameWndProc (HWND hwnd, UINT iMsg, WPARAM wParam,LPARAM lParam)
     {
     static HWND         hwndClient ;
     CLIENTCREATESTRUCT  clientcreate ;
     HWND                hwndChild ;
     MDICREATESTRUCT     mdicreate ;

     // Обработка сообщений
     switch (iMsg)
          {
          // Создание окна
          case WM_CREATE :          
               // Создание окна-администратора
               clientcreate.idFirstChild = IDM_FIRSTCHILD ;
               hwndClient = CreateWindow ("MDICLIENT", NULL,
                              WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
                              0, 0, 0, 0, hwnd, (HMENU) 1, hInst,
                              (LPSTR) &clientcreate) ;
          return 0 ;

          // Информирование о выборе какого-либо пункта меню
          case WM_COMMAND :
               switch (wParam)
                    {
                    // Если выбран пункт "New Ellipse"
                   /* case IDM_NEW :  
                         // Создание окна c текстом
                         mdicreate.szClass = szClass ;
                         mdicreate.szTitle = "New Ellipse" ;
                         mdicreate.hOwner  = hInst ;
                         mdicreate.x       = CW_USEDEFAULT ;
                         mdicreate.y       = CW_USEDEFAULT ;
                         mdicreate.cx      = CW_USEDEFAULT ;
                         mdicreate.cy      = CW_USEDEFAULT ;
                         mdicreate.style   = 0 ;
                         mdicreate.lParam  = 0 ;

                         hwndChild = (HWND) SendMessage (hwndClient,
                                        WM_MDICREATE, 0,
                                        (LPARAM) (LPMDICREATESTRUCT) &mdicreate) ;
                    return 0 ;*/

                    // Если выбран пункт "Open Metafile"
                    case IDM_META:       
                         // Создание окна с информащией о программе
                         mdicreate.szClass = szMetaClass ;
                         mdicreate.szTitle = "The Current Metafile" ;
                         mdicreate.hOwner  = hInst ;
                         mdicreate.x       = CW_USEDEFAULT ;
                         mdicreate.y       = CW_USEDEFAULT ;
                         mdicreate.cx      = CW_USEDEFAULT ;
                         mdicreate.cy      = CW_USEDEFAULT ;
                         mdicreate.style   = 0 ;
                         mdicreate.lParam  = 0 ;

                         hwndChild = (HWND) SendMessage (hwndClient,
                                        WM_MDICREATE, 0,
                                        (LPARAM) (LPMDICREATESTRUCT) &mdicreate) ;
                    return 0 ;
 case IDM_SAVE:
               hdcMeta=CreateMetaFile(szFileName);
                                       
                if (fValidBox)
                    {
                    SelectObject (hdcMeta, GetStockObject (BLACK_BRUSH)) ;
                    Ellipse(hdcMeta, ptBoxBeg.x, ptBoxBeg.y,
                                    ptBoxEnd.x, ptBoxEnd.y) ;
                    }

               if (fBlocking)
                    {
                    SetROP2 (hdcMeta, R2_NOT) ;
                    SelectObject (hdcMeta, GetStockObject (NULL_BRUSH)) ;
                   Ellipse(hdcMeta, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
                    }
               
                                       
               hmf = CloseMetaFile (hdcMeta);
               return 0;


                    // Выход из программы
                    case IDM_EXIT :        

                         SendMessage (hwnd, WM_DESTROY, 0, 0) ;
                         return 0 ;

                    default :          

                         hwndChild = (HWND) SendMessage (hwndClient,WM_MDIGETACTIVE, 0, 0) ;

                        if (IsWindow (hwndChild))
                             SendMessage (hwndChild, WM_COMMAND,
                                          wParam, lParam) ;
                       
                        break ;       
                    }
               break ;
          
          // Выходные действия
          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;
          }
               
     // Все сообщения, которые оконная процедура главного
     // окна не обрабатывает, передаются в DefFrameProc
     return DefFrameProc (hwnd, hwndClient, iMsg, wParam, lParam) ;
     }



void DrawBoxOutline (HWND hwnd, POINT ptBeg, POINT ptEnd)
     {
     HDC hdcMeta ,hdc;

     hdc = GetDC (hwnd) ;
   
     SetROP2 (hdc, R2_NOT) ;
     SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
    Ellipse(hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;

     ReleaseDC (hwnd, hdc) ;
     }

//----------------------------------------------------------------------
// Оконная процедура дочернего окна создания нового метафайла
//----------------------------------------------------------------------
LRESULT CALLBACK EllipseWndProc (HWND hwnd, UINT iMsg, WPARAM wParam,LPARAM lParam)
     {
  /*   static BOOL  fBlocking, fValidBox ;
     static POINT ptBeg, ptEnd, ptBoxBeg, ptBoxEnd ;
     static HWND      hwndClient, hwndFrame ;
    */ static HDC       hdc, hdcMeta;

     PAINTSTRUCT  ps ;

     switch (iMsg)
          {



          case WM_CREATE :
                       
               hwndClient = GetParent (hwnd) ;
               hwndFrame  = GetParent (hwndClient) ;
          return 0 ;
            
          case WM_LBUTTONDOWN :
               ptBeg.x = ptEnd.x = LOWORD (lParam) ;
               ptBeg.y = ptEnd.y = HIWORD (lParam) ;

               DrawBoxOutline (hwnd, ptBeg, ptEnd) ;

               SetCapture (hwnd) ;//Windows посылает все сообщения мыши в оконную процедуру того окна, описателем
                                //которого является hwnd
               SetCursor (LoadCursor (NULL, IDC_CROSS)) ;

               fBlocking = TRUE ;
                 
               return 0 ;

          case WM_MOUSEMOVE :
               if (fBlocking)
                    {
                    SetCursor (LoadCursor (NULL, IDC_CROSS)) ;

                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;

                    ptEnd.x = LOWORD (lParam) ;
                    ptEnd.y = HIWORD (lParam) ;
  
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                    }
          return 0 ;

          case WM_LBUTTONUP :
               if (fBlocking)
                    {
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;

                    ptBoxBeg   = ptBeg ;
                    ptBoxEnd.x = LOWORD (lParam) ;
                    ptBoxEnd.y = HIWORD (lParam) ;

                    ReleaseCapture () ;
                    SetCursor (LoadCursor (NULL, IDC_ARROW)) ;

                    fBlocking = FALSE ;
                    fValidBox  = TRUE ;

                    InvalidateRect (hwnd, NULL, TRUE) ;
                
                    }
               return 0 ;
//Обработка сообщения WM_CHAR позволяет
//отказаться от захвата мыши при нажатии пользователем клавиши <Escape>
          case WM_CHAR :
               if (fBlocking & wParam == '\x1B')       // i.e., Escape
                    {
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                    ReleaseCapture () ;
                    SetCursor (LoadCursor (NULL, IDC_ARROW)) ;

                    fBlocking = FALSE ;
                    }
               return 0 ;

         case WM_PAINT :
               hdc = BeginPaint (hwnd, &ps) ;
                
             if (fValidBox)
                    {
                    SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
                    Ellipse(hdc, ptBoxBeg.x, ptBoxBeg.y,
                                    ptBoxEnd.x, ptBoxEnd.y) ;
                    }

               if (fBlocking)
                    {
                    SetROP2 (hdc, R2_NOT) ;
                    SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
                   Ellipse(hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
                    }

                           
                EndPaint (hwnd, &ps) ;
               return 0 ;
            case WM_MDIACTIVATE :
               DrawMenuBar (hwndFrame) ;
               return 0 ;

          // Главное окно посылает асинхронное сообщение WM_QUERYENDSESSION?
          // когда пользователь выбирает в меню опцию Close 
       //case WM_QUERYENDSESSION :
         
                        
               
    /*     case IDM_SAVE:
               hdcMeta=CreateMetaFile(szFileName);
                                       
                if (fValidBox)
                    {
                    SelectObject (hdcMeta, GetStockObject (BLACK_BRUSH)) ;
                    Ellipse(hdcMeta, ptBoxBeg.x, ptBoxBeg.y,
                                    ptBoxEnd.x, ptBoxEnd.y) ;
                    }
:
               if (fBlocking)
                    {
                    SetROP2 (hdcMeta, R2_NOT) ;
                    SelectObject (hdcMeta, GetStockObject (NULL_BRUSH)) ;
                   Ellipse(hdcMeta, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
                    }
               
                                       
               hmf = CloseMetaFile (hdcMeta);
               return 0;
*/
             case WM_CLOSE :
               // Вывод на экран сообщения с запросом пользователю о том, 
               // можно ли закрывать окно
                if (IDOK != MessageBox (hwnd, "do you want Exit?", "Ellipse",
                                       MB_ICONQUESTION | MB_OKCANCEL))
              return 0 ;                         
          break;

          case WM_DESTROY :
             
               return 0 ;
          }
 // Все необработанные сообщения передаются в
     
     return DefMDIChildProc (hwnd, iMsg, wParam, lParam) ;
     }

//------------------------------------------------------------------
// Оконная процедура дочернего окна открытия метафайла
//------------------------------------------------------------------
LRESULT CALLBACK MetaWndProc (HWND hwnd, UINT iMsg, WPARAM wParam,LPARAM lParam)
     {
     static HWND    hwndClient, hwndFrame ;
     static HDC        hdc, hdcMeta;
     PAINTSTRUCT    ps ;

     // Обработка сообщений
     switch (iMsg)
          {
          // Создание окна
          case WM_CREATE :                         
               // Save some window handles
               hwndClient = GetParent (hwnd) ;
               hwndFrame  = GetParent (hwndClient) ;
               return 0 ;

          // Прорисовка окна
          case WM_PAINT :          
               // Начало вывода
               hdc = BeginPaint (hwnd, &ps) ;
               // Открытие метафайла
               hmf = GetMetaFile (szFileName);
               // Загрузка информации метафайла
               PlayMetaFile (hdc, hmf); 
               // Конец вывода 
               EndPaint (hwnd, &ps) ;
               return 0 ;

          case WM_MDIACTIVATE :    
               DrawMenuBar (hwndFrame) ;
               return 0 ;
          
          // Выходные действия
          case WM_DESTROY :
               // Удаление описателя метафайла
               DeleteMetaFile(hmf);               
               return 0 ;
          }
               
     // Все необработанные сообщения передаются в
      
     return DefMDIChildProc (hwnd, iMsg, wParam, lParam) ;
     }



Тут открывается метафаил. А что изменить надо чтобы  графических файл битового формата?

Добавлено через 14 минут и 41 секунду
вот нашел
Код

HBITMAP bitmap = (HBITMAP)LoadImage(NULL, fileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);

но не понятно куда его вставить
Код

// Если выбран пункт "Open Metafile"
                    case IDM_META:       
                         // Создание окна с информащией о программе
                         mdicreate.szClass = szMetaClass ;
                         mdicreate.szTitle = "The Current Metafile" ;
                         mdicreate.hOwner  = hInst ;
                         mdicreate.x       = CW_USEDEFAULT ;
                         mdicreate.y       = CW_USEDEFAULT ;
                         mdicreate.cx      = CW_USEDEFAULT ;
                         mdicreate.cy      = CW_USEDEFAULT ;
                         mdicreate.style   = 0 ;
                         mdicreate.lParam  = 0 ;

                         hwndChild = (HWND) SendMessage (hwndClient,
                                        WM_MDICREATE, 0,
                                        (LPARAM) (LPMDICREATESTRUCT) &mdicreate) ;
                    return 0 ;

по логике  сюда куда то.... Сори я в вин апи плохо шарю

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  7.rar 13,68 Kb
PM   Вверх
rthsobakas
Дата 7.5.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



помогите разобраться как загрузить в дочернюю форму бмп и если он большой то скролл сделать, плиз.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.4468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.