Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: 2 вопроса по PowerBasic Добавлено: 03.05.05 11:03  

Автор вопроса:  kolyanoid
Возник некоторый геморой с PB. Юзаю именно его, т.к. мне нужна обычная ДЛЛка, которая создаёт GUI.

1) Что-то очень геморойно делаются контролы с изогбражениями (IMAGEBUTTON и PICTUREBOX). Сама картинка в них должна загружаться из файла ресурсов. Есть ли способ это обойти? Мне просто картинки нужно задавать по ходу выполнения программы.

2) Проблема с ХР-контролами. Я юзаю manifest. Тык вот все контролы выглядят как надо, но когда делаешь TAB-контрол, то фоновый цвет других контролов не меняется если они находятся в нём (от этого всё выглядит убого). Делал контролы дочерними и пробовал сразу создавать внутри TAB'а - ничего не помогает.

Второй вопрос не "экстренный". Если ХРшных контролов не будет, то я не сильно расстроюсь. Вот первый вопрос - это конечно даааааа...

Если кто может с чем помочь, то скажу "спасиба" :)

Ответить

  Ответы Всего ответов: 22  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 03.05.05 16:07
Проще всего использовать обычный SS_BITMAP static вместо PICTUREBOX. Картинку в нем можно поменять в любой момент, послав ему сообщение STM_SETIMAGE с хэндлом битмапа в wParam'e. Битмап можно загружать как из ресурсов, так и из файла или ещё каким способом.

А с IMGBUTTON - проще пристрелить скотину, чем делать из неё что-то достойное внимания. И использовать какой-нибудь контрол-кнопку, позволяющую менять картинку. Либо рисовать кнопку самому, например на основе статика - тут вообще никаких ограничений, только твоя фантазия.

Ответить

Номер ответа: 2
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #2 Добавлено: 04.05.05 13:00
С трудом, но понял... только вопросы есть :)

1) Как непосредственно этот STATIC CONTROL сделать? Искал - не нашёл.
Битмапу гружу так:
iHnd& = LoadImage(0,"C:\DELETE.BMP",0,0,0,&H10)

Хэндл получаю нормальный. Даже список параметров этому STATIC'у нашёл, а самого - нет... Хдежь его взять? :)

2) Ещё было бы неплрхо самому окну иконку задать, а то вида свою убогую суёт. Это также делается?

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 04.05.05 13:18
По моему Control Add Label и добавляет этот самый STATIC.

Ответить

Номер ответа: 4
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 04.05.05 13:22
Значёк сделать очень просто. Создаешь RC-файл, а в нём пишешь имя значка, такое же как и имя экзешника. Затем всё это дело переводишь в PBR и в исходник добавляешь метаоператор #RESOURCE "MyRes.PBR"

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 04.05.05 14:46
STATIC элементарно лепится на форму через CreateWindowEx.

Ответить

Номер ответа: 6
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #6 Добавлено: 04.05.05 19:37
Dim hStatic as LONG
Dim Ret AS LONG
hStatic = CreateWindowEx(0,
                         "static",
                         "",
                         %WS_CHILD or %SS_ICON,
                         2,
                         2,
                         100,
                         100,
                         hParent,
                         2000,
                         hInstance,
                         0)
iHnd& = LoadImage(0,"C:\DELETE.BMP",0,0,0,&H10)
Ret = SendMessage(hStatic,%STM_SETIMAGE,%IMAGE_BITMAP,iHnd&;)

Ответить

Номер ответа: 7
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #7 Добавлено: 04.05.05 19:40
Тю, блин, тут :%SS_ICON естественно должно быть %SS_BITMAP

Ответить

Номер ответа: 8
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #8 Добавлено: 04.05.05 22:59
Пасиба, щас попробую.

2CyRax
Тык вот мне лучше этот значок через саму ДЛЛовкую функцию и задать. Я эту ДЛЛ пишу для ламеров и себя, поэтому всё должно быть предельно просто. Чтоб к их играм\прогам никаких лишних файлов (ресурсов) не лепить. Только ДЛЛ. А значок задавался типа: CALL DLL dll#,icon_path$ и всё.... Поэтому файл ресурсов мне никак...

P.S.
Ды и не умею я с ними работать ^_^

Ответить

Номер ответа: 9
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #9 Добавлено: 04.05.05 23:21
Не пашет... по-разному пробовал - ноль...
Картинка грузится (хэндл получаю), CreateWindowEx тоже нормальный хэндл даёт. А вот SendMessage - 0

Вы уж извиняйте за мой ламоразм, но мне кажется, что тут всё дело в hInstance. В PB как его узнать? В ВБ просто, а в ПБ?

Ещё компилятор ругался на последний параметр в CreateWindowEx: говорил, нужна переменная (я ему пустую подсунул)

Кстати, на окне этот STATIC не появляется...

PS.
Может я битмап не с теми параметрами гружу?

Ответить

Номер ответа: 10
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #10 Добавлено: 04.05.05 23:22
hInstance я имел в виду самой проги (или процесса, или чего там передавать надо?) :)

Ответить

Номер ответа: 11
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #11 Добавлено: 05.05.05 09:49
Вот этот пример есть в папке c примерами PBWin70,
zя тут добавил статик и объявления переменных. Картинка отображается в статике. Только измени название файла с "c:\test.bmp" на своё. Тут много чего лишнего, просто писать с нуля лень :), вот и прицепил к примеру статик.

'==============================================================================

#COMPILE EXE
#DIM ALL

#INCLUDE "WIN32API.INC"
'#RESOURCE "HELLOWIN.PBR"     ' this gives the program the "hellowin" icon



FUNCTION WINMAIN (BYVAL hInstance     AS DWORD, _
                  BYVAL hPrevInstance AS DWORD, _
                  BYVAL lpCmdLine     AS ASCIIZ PTR, _
                  BYVAL iCmdShow      AS LONG) AS LONG

    LOCAL Msg       AS tagMsg
    LOCAL wce       AS WndClassEx
    LOCAL szAppName AS ASCIIZ * 80
    LOCAL hWnd      AS DWORD
    LOCAL hStatic   AS DWORD
    LOCAL hBitmap   AS DWORD
    LOCAL Ret       AS LONG
    
    

    szAppName = "HelloWin"

    wce.cbSize      = SIZEOF(wce)
    wce.style       = %CS_HREDRAW OR %CS_VREDRAW

    ' CODEPTR is used to pass the address of the function that will
    ' receive all messages sent to any window created with this class
    wce.lpfnWndProc   = CODEPTR(WndProc)

    wce.cbClsExtra    = 0
    wce.cbWndExtra    = 0
    wce.hInstance     = hInstance
    wce.hIcon         = LoadIcon(hInstance, "HELLOWIN";)
    wce.hCursor       = LoadCursor(%NULL, BYVAL %IDC_ARROW)
    wce.hbrBackground = %NULL ' No class background, we do it outselves
    wce.lpszMenuName  = %NULL
    wce.lpszClassName = VARPTR(szAppName)
    wce.hIconSm       = LoadIcon(hInstance, BYVAL %IDI_APPLICATION)

    RegisterClassEx wce

    ' Create a window using the registered class
    hWnd = CreateWindow(szAppName, _               ' window class name
                        "The Hello Program", _     ' window caption
                        %WS_OVERLAPPEDWINDOW, _    ' window style
                        %CW_USEDEFAULT, _          ' initial x position
                        %CW_USEDEFAULT, _          ' initial y position
                        %CW_USEDEFAULT, _          ' initial x size
                        %CW_USEDEFAULT, _          ' initial y size
                        %NULL, _                   ' parent window handle
                        %NULL, _                   ' window menu handle
                        hInstance, _               ' program instance handle
                        BYVAL %NULL)               ' creation parameters

    hStatic = CreateWindow("static", _               ' window class name
                        "", _     ' window caption
                        %WS_CHILD OR %WS_VISIBLE OR %SS_BITMAP, _    ' window style
                        20, _          ' initial x position
                        20, _          ' initial y position
                        100, _          ' initial x size
                        100, _          ' initial y size
                        hWnd, _                   ' parent window handle
                        %NULL, _                   ' window menu handle
                        hInstance, _               ' program instance handle
                        BYVAL %NULL)               ' creation parameters
    
    hBitmap = LoadImage(0,"C:\test.bmp",0,0,0,&H10)
    Ret = SendMessage(hStatic,%STM_SETIMAGE,%IMAGE_BITMAP,hBitmap)
                        
    IF hWnd = 0 THEN
        MSGBOX "Unable to create window"
        EXIT FUNCTION
    END IF

    ' Display the window on the screen
    ShowWindow hWnd, iCmdShow
    UpdateWindow hWnd

    ' Main message loop:
    ' Messages sent to HELLOWIN while it has the focus are received by
    ' GetMessage().  This loop translates each message and dispatches it
    ' to the appropriate handler.  When PostQuitMessage() is called, the
    ' loop terminates which ends the application.
    ;DO WHILE GetMessage(Msg, %NULL, 0, 0)
        TranslateMessage Msg
        ;DispatchMessage Msg
    LOOP

    FUNCTION = msg.wParam

END FUNCTION



SUB DrawGradient (BYVAL hDC AS DWORD)

    LOCAL rectFill AS RECT
    LOCAL rectClient AS RECT
    LOCAL fStep AS SINGLE
    LOCAL hBrush AS DWORD
    LOCAL lOnBand AS LONG

    GetClientRect WindowFromDC(hDC), rectClient
    fStep = rectClient.nbottom / 200

    FOR lOnBand = 0 TO 199
        SetRect rectFill, 0, lOnBand * fStep, rectClient.nright + 1, (lOnBand + 1) * fStep
        hBrush = CreateSolidBrush(RGB(0, 0, (255 - lOnBand)))
        Fillrect hDC, rectFill, hBrush
        ;DeleteObject hBrush
    NEXT

END SUB



' WndProc is the message handler for all windows creating using the HelloWin
' class name.  A single WndProc procedure can handle multiple windows by
' testing the hWnd variable passed to it.
FUNCTION WndProc (BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, _
                  BYVAL wParam AS DWORD, BYVAL lParam AS LONG) EXPORT AS LONG

    LOCAL hDC    AS DWORD
    LOCAL pPaint AS PAINTSTRUCT
    LOCAL tRect  AS RECT

    ' The SELECT CASE is used to catch only those messages which the message
    ' handler needs to process.  All other messages are passed through the
    ' tests to the default handler.
    SELECT CASE wMsg

    CASE %WM_CREATE

    CASE %WM_PAINT
        hDC = BeginPaint(hWnd, pPaint)
        GetClientRect hWnd, tRect
        SetBkMode hDC, %TRANSPARENT
        SetTextColor hDC, %WHITE
        ;DrawText hDC, "Hello, Windows!", -1, tRect, %DT_SINGLELINE OR %DT_CENTER OR %DT_VCENTER
        EndPaint hWnd, pPaint
        FUNCTION = 1
        EXIT FUNCTION

    CASE %WM_ERASEBKGND
        hDC = wParam
        ;DrawGradient hDC              ' Pass the DC of the region to repaint
        FUNCTION = 1
        EXIT FUNCTION

    CASE %WM_DESTROY
        PostQuitMessage 0
        FUNCTION = 0
        EXIT FUNCTION

    END SELECT

    ' Any message which is not handled in the above SELECT CASE reaches this
    ' point and is processed by the Windows default message handler.
    FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam)

END FUNCTION


hInstance передается как входной параметр в WinMain. Ты наверное использовал вместо WinMain PBMAIN, поэтому hInstance у тебя нет :)

Ответить

Номер ответа: 12
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #12 Добавлено: 05.05.05 10:28

CreateWindowEx тоже нормальный хэндл даёт. А вот SendMessage - 0

SendMessage возвращает результат зависимый от сообщения. Если возвращает 0 - это не означает ошибку.


Ещё компилятор ругался на последний параметр в CreateWindowEx: говорил, нужна переменная (я ему пустую подсунул)

Не, тут все нормально

Кстати, на окне этот STATIC не появляется...

Про ShowWindow не забыл?

Может я битмап не с теми параметрами гружу?

С теми, пробуй дальше :)

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 05.05.05 10:36

CONTROL ADD LABEL statement
Add a text label to a dialog. A text label is similar to a conventional static control.
CONTROL ADD LABEL, hDlg&, id&, txt$, x, y, xx, yy [, [style&] [, [exstyle&]]] [[,] CALL callback]

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 05.05.05 10:46
Лучше используй CreateWindowEx. Всё равно в Win32API.inc CreateWindow - это заглушка, которая вызывает CreateWindowEx.


#IF %DEF(%CCWIN)
FUNCTION CreateWindow (lpClassName AS ASCIIZ, lpWindowName AS ASCIIZ, BYVAL dwStyle AS DWORD, BYVAL xx AS LONG, BYVAL yy AS LONG, BYVAL nWidth AS LONG, _
BYVAL nHeight AS LONG, BYVAL hwndParent AS DWORD, BYVAL hMenu AS DWORD, BYVAL hInstance AS DWORD, BYVAL lpParam AS DWORD) AS LONG
FUNCTION = CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, xx, yy, nWidth, nHeight, hWndParent, hMenu, hInstance, BYVAL lpParam)
END FUNCTION
#ENDIF

Ответить

Номер ответа: 15
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #15 Добавлено: 05.05.05 18:15
2HOOLIGAN
Пример не пашет. Ругается на "Multiple Main Functions have been defined" :(
И я делаю ДЛЛ, а не ЕХЕ. Более того, я даже не могу юзать LIBMAIN и т.п., ибо тогда ДЛЛка не загрузится (DarkBasic скажет "не могу загрузить ДЛЛ";). Поэтому я вообще без неё :)

Вообще никак не пашет... Ни с лейблом, ни с CreateWindowEx... Ни со стандартным CONTROL SEND ни с АПИшным... Ни с нормальными параметрами, ни с какими другими.... НОЛЬ.

Ладно, не будет imgbox'ов - и хрен с ними.
Всем спасибо, народ :) Сорри, за дерготню и ламошность :(

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам