GUI и изображения.

Предыдущая тема Следующая тема Перейти вниз

GUI и изображения.

Сообщение  trew в Сб Окт 30, 2010 6:22 am

Помогите пожалуйста, кто знает. Вот код вывода изображения в окне. Как дополнить этот код таким образом, чтобы можно было получить размеры изображения. На Оф форуме не могу получить ответов, наверно здорово хромает мой английский Very Happy.

Код:
#Include "windows.bi"
Dim As MSG msg
Dim As Integer hinst,hWnd
Dim Shared As RECT rect
Dim Shared As integer hWnd1,hBitmap

hinst=GetModuleHandle(0)
hBitmap=LoadImage(hinst,@"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
hWnd = CreateWindowEx( 0, "#32770", "Hello", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, 100, 100, 500, 300, 0, 0, 0, 0 )
hWnd1 = CreateWindowEx( 0, "static", "Hello", WS_CHILD Or WS_VISIBLE, 10, 100, 300, 100, hwnd,0,1,0)
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Function pai() As Integer
            dim as hdc DC=getdc(hwnd1)
            Var mem= CreateCompatibleDC(dc)
            SelectObject(Mem,hBitmap)
            GetClientRect(hWnd1, @rect)
            BitBlt(dc,0,0,rect.right,rect.bottom,mem,0,0,SRCCOPY)
              DeleteDC(mem)
            releasedc(hWnd1,dc)
End Function
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
While GetMessage( @msg, 0, 0, 0 ) 
  TranslateMessage( @msg )
  DispatchMessage( @msg )
  pai()
        Select case msg.message
           Case WM_COMMAND
              If msg.hwnd=hwnd Then
              End
              EndIf   
        End Select
Wend
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  Саня в Сб Окт 30, 2010 10:09 am

Честно гря не знаю, но ты там используешь формат Bmp, => если в файле этого формата хранятся эти данные, то нужно только их вытащить оттуда, => гуглим обзор структуры файла и находим..в вики
скорее всего надо сделать подобную структуру заголовка файла, а там в зависимости от bfOffbits смотреть...
Код:


 Type tagBITMAPFILEHEADER
   Dim UShort    bfType
   Dim Integer   bfSize
   Dim UShort    bfReserved1
   Dim UShort    bfReserved2
   Dim Integer   bfOffBits
End Type
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  trew в Сб Окт 30, 2010 10:50 am

Структуру Bmp смотрел до создания этого топа, вытащить из файла знаю как. Плохо, что придется дважды теребить файл. То есть открыть прочитать по нужным смещениям размеры, а потом загружать с помощью LoadImage. Мне думается, что раз файл загружен в память, размеры его должны быть где то обозначены. Ведь выводится же фото с правильными размерами в окно. Хотя может айпишка BitBlt при неуказанных параметрах в LoadImage, сама открывает файл и читает оттуда каждый раз.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  Саня в Пн Ноя 01, 2010 7:17 pm

ааа.. понятно, блин. тогда особо не помогу. ну может разве что - Корректировка ресурсов
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  gromov в Пн Ноя 01, 2010 11:46 pm

Если будеш работать только битмапами попробуй использовать функцию GetObject.
Код:

' из файла wingdi.bi
declare function GetObject alias "GetObjectA" (byval as HGDIOBJ, byval as integer, byval as PVOID) as integer
или
declare function GetObject alias "GetObjectW" (byval as HGDIOBJ, byval as integer, byval as PVOID) as integer
Для твоего случая:
первый параметр - указатель на битмап (результат функции LoadImage или LoadBitmap)
второй - размер структуры BITMAP (sizeof(BITMAP))
третий - указатель на структуру BITMAP (неоходимо предварительно создавать)

Если правильно задать параметры, то функция вернет заполненую структуру BITMAP (указаную в третем параметре)

Код:

' из файла wingdi.bi
type BITMAP
    bmType as LONG
    bmWidth as LONG
    bmHeight as LONG
    bmWidthBytes as LONG
    bmPlanes as WORD
    bmBitsPixel as WORD
    bmBits as LPVOID
end type

А здесь есть все что тебе надо.

gromov

Сообщения : 7
Дата регистрации : 2008-08-31
Возраст : 39
Откуда : Украина, Броды

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  trew в Вт Ноя 02, 2010 6:15 am

Это то, что нужно. Спасибо!

Подведу итог:

Код:
#Include "windows.bi"
Dim As MSG msg
Dim As Integer hinst,hWnd,hwnd2
Dim Shared As RECT rect
Dim Shared As integer hWnd1,hBitmap
Dim size As BITMAP

hinst=GetModuleHandle(0)
hBitmap=LoadImage(hinst,@"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
getobject(hBitmap,sizeof(BITMAP),@size)
hWnd = CreateWindowEx( 0, "#32770", "Hello", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, 100, 100, 500, 300, 0, 0, 0, 0 )
hWnd1 = CreateWindowEx( 0, "static", "Hello", WS_CHILD Or WS_VISIBLE, 10, 100, 300, 100, hwnd,0,1,0)
hwnd2 = CreateWindowEx( 0, "static", str(size.bmWidth)+" "+str(size.bmHeight), WS_CHILD Or WS_VISIBLE, 10, 10, 300, 100, hwnd,0,2,0)
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Function pai() As Integer
            dim as hdc DC=getdc(hwnd1)
            Var mem= CreateCompatibleDC(dc)
            SelectObject(Mem,hBitmap)
            GetClientRect(hWnd1, @rect)
            BitBlt(dc,0,0,rect.right,rect.bottom,mem,0,0,SRCCOPY)
              DeleteDC(mem)
            releasedc(hWnd1,dc)
End Function
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
While GetMessage( @msg, 0, 0, 0 ) 
  TranslateMessage( @msg )
  DispatchMessage( @msg )
  pai()
        Select case msg.message
           Case WM_COMMAND
              If msg.hwnd=hwnd Then
              End
              EndIf   
        End Select
Wend
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  trew в Ср Ноя 03, 2010 3:51 pm

Возник такой вопрос:
Как вообще создаются кнопки с изображениями? Я создал код, но как не крутил, не получается одновременное нажатие и смещение рисунка No То есть, если часто нажимать на кнопку, то изображение не успевает за нажатием. Помогите пожалуйста. Вот код:

Код:
#Include "windows.bi"
'#Include "myst.bi"

Dim As MSG msg
Dim shared As RECT rect
Var hinst=GetModuleHandle(0)
Dim shared As integer hBitmap1,Ferst_x,Ferst_y
Dim  shared hBitmap2 As integer
hBitmap2=LoadImage(hinst,@"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
hBitmap1=LoadImage(hinst,@"2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
Dim shared As Integer hWnd2
Var hwnd = CreateWindowEx( 0, "#32770", "Hello", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, 100, 100, 500, 300, 0, 0, 0, 0 )
Var hWnd1 = CreateWindowEx( 0, "button", "Hello", WS_CHILD Or WS_VISIBLE, 10, 100, 40, 20, hwnd,0,1,0)
hWnd2 = CreateWindowEx( 0, "button", "",WS_CHILD Or WS_VISIBLE Or BS_BITMAP, 0, 0, 300, 90, hwnd, 0, 3, 0 )

Function pai() As Integer
'         Do
            dim as hdc DC=getdc(hwnd2)
            Var mem= CreateCompatibleDC(dc)
            SelectObject(Mem,hBitmap2)
            GetClientRect(hWnd2, @rect)
            BitBlt(dc,Ferst_x,Ferst_y,rect.right,rect.bottom,mem,0,0,SRCCOPY)
              DeleteDC(mem)
            releasedc(hWnd2,dc)
'         Loop
        
End Function
'Var hThread = CreateThread( 0, 0, @pai, 0, 0, 0 )
SetTimer(hWnd2,1,0,@pai())
While GetMessage( @msg, 0, 0, 0 ) 
  TranslateMessage( @msg )
  DispatchMessage( @msg )
  pai()
        Select case msg.message
           Case WM_COMMAND
'              CloseHandle( hThread )
              If msg.hwnd=hwnd Then
              End
            ElseIf msg.hwnd=hwnd2 then
               DestroyWindow(hwnd2)   
              EndIf

           Case WM_LBUTTONUP
              Select Case msg.hwnd
                 Case hwnd1
                    hBitmap2=hBitmap1
                    SendMessage(hWnd2,STM_SETIMAGE,IMAGE_BITMAP,hBitmap2)
                    InvalidateRect(hwnd2,@rect,TRUE)
                 Case hwnd2
                    Ferst_x=0
                    Ferst_y=0
                     InvalidateRect(hwnd,0,TRUE)         
              End Select     
           Case WM_LBUTTONDOWN
              Select Case msg.hwnd
                Case hwnd2
                    Ferst_x=2
                    Ferst_y=2    
                    pai()   
              End Select
        End Select
Wend

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  trew в Ср Ноя 03, 2010 8:14 pm

Нашел на английском форуме ответ. Честно говоря, случайно наткнулся на код, в котором было то, что мне и надо. Вынул оттуда все необходимое...

Код:
#Include "windows.bi"
Dim As MSG msg
Dim As Integer hinst,hWnd
Dim Shared As RECT rect
Dim Shared As integer hWnd1,hBitmap

hinst=GetModuleHandle(0)
hBitmap=LoadImage(hinst,@"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
hWnd = CreateWindowEx( 0, "#32770", "Hello", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, 100, 100, 500, 300, 0, 0, 0, 0 )
hWnd1=  CreateWindowEx(WS_EX_CLIENTEDGE, "Button", 0,WS_CHILD Or WS_VISIBLE Or WS_TABSTOP Or BS_BITMAP, _
    100,  100,300, 100,hwnd, 103, GetModuleHandle(null),  NULL) 
SendMessage GetDlgItem(hwnd, 103), BM_SETIMAGE, IMAGE_BITMAP, CInt(hBitmap)
While GetMessage( @msg, 0, 0, 0 ) 
  TranslateMessage( @msg )
  DispatchMessage( @msg )
        Select case msg.message
           Case WM_COMMAND
              If msg.hwnd=hwnd Then
              End
              EndIf   
        End Select
Wend


trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: GUI и изображения.

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения