Рисование фигур (линий) на форме в VBA для Excel.
От: Tonop  
Дата: 10.05.03 14:01
Оценка:
Всезнающий ОЛ!
Сколько не пытался так и не смог найти ответ на сабж. Как на форме, созданной в проекте в VBE в Excel, нарисовать графические фигуры и выводить текст? Метод Line у формы отсутствует, и графический контекст окна, чтоб использовать API, я получить не смог. Может, кто-нибудь когда-нибудь этим занимался или пример видел.
Буду очень благодарен.
Re: Рисование фигур (линий) на форме в VBA для Excel.
От: BugMan  
Дата: 10.05.03 17:36
Оценка:
Здравствуйте, Tonop, Вы писали:

T>Всезнающий ОЛ!

T>Сколько не пытался так и не смог найти ответ на сабж. Как на форме, созданной в проекте в VBE в Excel, нарисовать графические фигуры и выводить текст? Метод Line у формы отсутствует, и графический контекст окна, чтоб использовать API, я получить не смог. Может, кто-нибудь когда-нибудь этим занимался или пример видел.
T>Буду очень благодарен.
А хендл у формы есть? Есль есть то поможет
Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
Re[2]: Рисование фигур (линий) на форме в VBA для Excel.
От: Tonop  
Дата: 10.05.03 17:54
Оценка:
Здравствуйте, BugMan, Вы писали:

BM>А хендл у формы есть? Есль есть то поможет

BM>
BM>Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
BM>


Неа, нету
Ну, или он хитро спрятан.
Re[3]: Рисование фигур (линий) на форме в VBA для Excel.
От: BugMan  
Дата: 11.05.03 00:54
Оценка:
Здравствуйте, Tonop, Вы писали:

T>Неа, нету

T>Ну, или он хитро спрятан.
Можно в принципе извернуться через Picture свойство. Отрисуешся ручками через GDI и из полученного хендла на битмап создашь обьект типа IPictureDisp и присвоешь его форме (ну или контролу на форме).
Re[4]: Рисование фигур (линий) на форме в VBA для Excel.
От: Tonop  
Дата: 11.05.03 15:12
Оценка:
Здравствуйте, BugMan, Вы писали:


BM>Можно в принципе извернуться через Picture свойство. Отрисуешся ручками через GDI и из полученного хендла на битмап создашь обьект типа IPictureDisp и присвоешь его форме (ну или контролу на форме).


А можно поподробнее, если не затруднит.
Re[5]: Рисование фигур (линий) на форме в VBA для Excel.
От: BugMan  
Дата: 11.05.03 20:47
Оценка:
Здравствуйте, Tonop, Вы писали:

T>А можно поподробнее, если не затруднит.

Ну ты это..... сам понимаешь.....

Короче так:

Dim hDCDest As Long
Dim hBMPDest As Long
Dim hBMPOld As Long
Dim hDCScreen As Long
Dim pic As IPictureDisp

    'Берем DC десктопа - нужен для создания совместимых обьектов
    hDCScreen = GetWindowDC(0)
    
    ' тут создаем временный DC и конечный битмап с нужными размерами
    hDCDest = CreateCompatibleDC(hDCScreen)
    hBMPDest = CreateCompatibleBitmap(hDCScreen, nWidth, nHeight)
    hBMPOld = SelectObject(hDCDest, hBMPDest)    

    ' тут рисуешь на hDCDest всё чё надо
    .....

    ' сохраняем получившийся битмап
    hBMPDest = SelectObject(hDCDest, hBMPOld)
    
    ' чистим
    DeleteDC hDCDest
    ReleaseDC 0, hDCScreen
    
    ' описание этой функции [url=http://www.rsdn.ru/Forum/Message.aspx?mid=259283&only=1]тут[/url]
    Set pic = ConvertBmpToIPicture(hBMPDest)


Ну а дальше всё просто.....
Re[6]: Рисование фигур (линий) на форме в VBA для Excel.
От: Tonop  
Дата: 13.05.03 00:46
Оценка:
Здравствуйте, BugMan, Вы писали:

BM>Ну ты это..... сам понимаешь.....


BM>Короче так:


BM>Ну а дальше всё просто.....


Супер!

Все заработало. Спасибо огромное!!!
Теперь буду адаптировать это к своей задаче.

PS: Таких извращений я с универа не видел

PPS: А на счет , если ты в Питере, то можно и
Re[7]: Рисование фигур (линий) на форме в VBA для Excel.
От: BugMan  
Дата: 13.05.03 17:41
Оценка:
Здравствуйте, Tonop, Вы писали:

[покоцано]

T>Все заработало. Спасибо огромное!!!

T>Теперь буду адаптировать это к своей задаче.

T>PS: Таких извращений я с универа не видел

Ну извини , я вообще то в VBA не бум-бум, так что может как-то по другому можно, но я не знаю
Потому как, и hDC и hWnd у формы должны быть, просто в Экселевских классах они почему-то спрятаны.
Можно еще конечно зная положение самой формы на экране (и будучи уверенным в её видимости) поюзать
Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

Это даст тебе хэндл. Способ не оч красивый, но если нужна будет частая перерисовка, то лучше конечно так, и тогда последний шаг заменяешь на BitBlt(). Эсли скорость не важна то первый способ будет лучше

T>PPS: А на счет , если ты в Питере, то можно и

Неа, не в Питере, да и вообще это просто шутка была
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.