En esta sección iré poniendo algunos códigos cortos que pueden ser de gran utilidad.
RENDER STRETCH
Esta es una función que sirve para pintar una imágen de forma ampliada pero manteniendo su contorno original, para que se entienda, cuando utilizamos PaintPicture o StretchBlt en una imágen, ésta se estira proporcionalmente y en un caso como éste (imágen) el borde del botón se deformaría, en esta función debe pasarse un parámetro en el cual debe indicarse un ancho/alto en común para los bordes.
Option Explicit 'Autor: Leandro Ascierto 'Web: www.leandroascierto.com.ar Private Declare Function StretchBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long Private Declare Function GdiTransparentBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Function RenderStretchFromDC(ByVal DestDC As Long, _ ByVal DestX As Long, _ ByVal DestY As Long, _ ByVal DestW As Long, _ ByVal DestH As Long, _ ByVal SrcDC As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal Width As Long, _ ByVal Height As Long, _ ByVal Size As Long, _ Optional MaskColor As Long = -1) Dim Sx2 As Long Sx2 = Size * 2 If MaskColor <> -1 Then Dim mDC As Long Dim mX As Long Dim mY As Long Dim DC As Long Dim hBmp As Long Dim hOldBmp As Long mDC = DestDC DC = GetDC(0) DestDC = CreateCompatibleDC(0) hBmp = CreateCompatibleBitmap(DC, DestW, DestH) hOldBmp = SelectObject(DestDC, hBmp) ' save the original BMP for later reselection mX = DestX: mY = DestY DestX = 0: DestY = 0 End If SetStretchBltMode DestDC, vbPaletteModeNone BitBlt DestDC, DestX, DestY, Size, Size, SrcDC, x, y, vbSrcCopy 'TOP_LEFT StretchBlt DestDC, DestX + Size, DestY, DestW - Sx2, Size, SrcDC, x + Size, y, Width - Sx2, Size, vbSrcCopy 'TOP_CENTER BitBlt DestDC, DestX + DestW - Size, DestY, Size, Size, SrcDC, x + Width - Size, y, vbSrcCopy 'TOP_RIGHT StretchBlt DestDC, DestX, DestY + Size, Size, DestH - Sx2, SrcDC, x, y + Size, Size, Height - Sx2, vbSrcCopy 'MID_LEFT StretchBlt DestDC, DestX + Size, DestY + Size, DestW - Sx2, DestH - Sx2, SrcDC, x + Size, y + Size, Width - Sx2, Height - Sx2, vbSrcCopy 'MID_CENTER StretchBlt DestDC, DestX + DestW - Size, DestY + Size, Size, DestH - Sx2, SrcDC, x + Width - Size, y + Size, Size, Height - Sx2, vbSrcCopy 'MID_RIGHT BitBlt DestDC, DestX, DestY + DestH - Size, Size, Size, SrcDC, x, y + Height - Size, vbSrcCopy 'BOTTOM_LEFT StretchBlt DestDC, DestX + Size, DestY + DestH - Size, DestW - Sx2, Size, SrcDC, x + Size, y + Height - Size, Width - Sx2, Size, vbSrcCopy 'BOTTOM_CENTER BitBlt DestDC, DestX + DestW - Size, DestY + DestH - Size, Size, Size, SrcDC, x + Width - Size, y + Height - Size, vbSrcCopy 'BOTTOM_RIGHT If MaskColor <> -1 Then GdiTransparentBlt mDC, mX, mY, DestW, DestH, DestDC, 0, 0, DestW, DestH, MaskColor SelectObject DestDC, hOldBmp DeleteObject hBmp DeleteDC DC DeleteDC DestDC End If End Function Private Function RenderStretchFromPicture(ByVal DestDC As Long, _ ByVal DestX As Long, _ ByVal DestY As Long, _ ByVal DestW As Long, _ ByVal DestH As Long, _ ByVal SrcPicture As StdPicture, _ ByVal x As Long, _ ByVal y As Long, _ ByVal Width As Long, _ ByVal Height As Long, _ ByVal Size As Long, _ Optional MaskColor As Long = -1) Dim DC As Long Dim hOldBmp As Long DC = CreateCompatibleDC(0) hOldBmp = SelectObject(DC, SrcPicture.Handle) RenderStretchFromDC DestDC, DestX, DestY, DestW, DestH, DC, x, y, Width, Height, Size, MaskColor hOldBmp = SelectObject(DC, hOldBmp) DeleteDC DC End Function
|
|
RenderStretch.zip 12 Kb Descargado 139 veces |
PONER UN FORMULARIO MDI EN FULLSCREEN
Este es un módulo que nos permitirá poner un formulario MDI en modo FullScreen cuando está maximizado, la ventaja de esto es ganarle un poco más de espacio al monitor, y sobre todo cuando el software tiene un papel protagónico en el PC que lo ejecuta.
Código del módulo bas "MdiFullScreen"
Option Explicit Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal ID As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal ID As Long) As Long Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long Private Const HWND_TOPMOST As Long = -1 Private Const HWND_NOTOPMOST As Long = -2 Private Const SWP_NOACTIVATE As Long = &H10 Private Const SWP_NOSIZE As Long = &H1 Private Const SWP_NOMOVE As Long = &H2 Private Const SWP_SHOWWINDOW As Long = &H40 Private Const WS_MAXIMIZEBOX As Long = &H10000 Private Const WS_MINIMIZEBOX As Long = &H20000 Private Const WS_THICKFRAME As Long = &H40000 Private Const WS_SYSMENU As Long = &H80000 Private Const WS_CAPTION As Long = &HC00000 Private Const SC_RESTORE As Long = &HF120& Private Const WM_ACTIVATEAPP As Long = &H1C Private Const WM_HOTKEY As Long = &H312 Private Const WM_SYSCOMMAND As Long = &H112 Private Const GWL_STYLE As Long = (-16) Private Const GWL_WNDPROC As Long = (-4) Const MyHotKey As Long = &H1000 Dim WndStyle As Long Dim bFullScreen As Boolean Dim PrevProc As Long Public Sub ShowFullScreen(hwnd As Long) If Not bFullScreen Then bFullScreen = True Call RegisterHotKey(hwnd, MyHotKey, 0, vbKeyEscape) WndStyle = GetWindowLong(hwnd, GWL_STYLE) SetWindowLong hwnd, GWL_STYLE, WndStyle And Not WS_MAXIMIZEBOX And Not WS_MINIMIZEBOX And Not WS_THICKFRAME And Not WS_CAPTION SetWindowPos hwnd, HWND_TOPMOST, 0, 0, Screen.Width / 15, Screen.Height / 15, SWP_NOACTIVATE PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End If End Sub Public Sub EndFullScreen(hwnd) If bFullScreen Then bFullScreen = False SetWindowLong hwnd, GWL_STYLE, WndStyle SendMessage hwnd, WM_SYSCOMMAND, SC_RESTORE, ByVal 0& SetWindowLong hwnd, GWL_WNDPROC, PrevProc Call UnregisterHotKey(hwnd, MyHotKey) End If End Sub Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) If uMsg = WM_ACTIVATEAPP Then EndFullScreen hwnd End If If uMsg = WM_HOTKEY Then If wParam = MyHotKey Then EndFullScreen hwnd End If End If End Function
Código en el Formulario MDI
Option Explicit Private Sub MDIForm_Load() Form1.Show End Sub Private Sub MDIForm_Resize() If Me.WindowState = vbMaximized Then ShowFullScreen Me.hwnd Else EndFullScreen Me.hwnd End If End Sub
RENDER STRETCH PLUS
Igual que la función superior esta sirve para pintar una imágen de forma ampliada pero manteniendo su contorno original utilizando GDI PLUS, esto nos da como ventaja poder utilizar gráficos .PNG entre otros. Nótese que si ponemos el form con AutoRedraw = True la función trabaja más rápido.
Option Explicit 'Autor Leandro Ascierto 'Web www.leandroascierto.com.ar Private Declare Function GdipDrawImageRectRectI Lib "gdiplus" (ByVal hGraphics As Long, ByVal hImage As Long, ByVal dstX As Long, ByVal dstY As Long, ByVal dstWidth As Long, ByVal dstHeight As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal SrcWidth As Long, ByVal SrcHeight As Long, ByVal srcUnit As Long, Optional ByVal imageAttributes As Long = 0, Optional ByVal Callback As Long = 0, Optional ByVal CallbackData As Long = 0) As Long Private Declare Function GdipSetInterpolationMode Lib "gdiplus" (ByVal graphics As Long, ByVal InterpolationMode As Long) As Long Private Declare Function GdipSetPixelOffsetMode Lib "gdiplus" (ByVal graphics As Long, ByVal PixelOffsetMode As Long) As Long Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, ByRef graphics As Long) As Long Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As Long Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, ByRef image As Long) As Long Private Declare Function GdiplusStartup Lib "gdiplus" (ByRef token As Long, ByRef lpInput As GDIPlusStartupInput, Optional ByRef lpOutput As Any) As Long Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As Long Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long Private Type GDIPlusStartupInput GdiPlusVersion As Long DebugEventCallback As Long SuppressBackgroundThread As Long SuppressExternalCodecs As Long End Type Private Const GdiPlusVersion As Long = 1& Private Const QualityModeHigh As Long = 2& Private Const InterpolationModeNearestNeighbor As Long = QualityModeHigh + 3 Private Const PixelOffsetModeHalf As Long = QualityModeHigh + 2 Dim GdipToken As Long Dim m_hImage As Long Private Sub RenderStretchPlus(ByVal DestHdc As Long, _ ByVal DestX As Long, _ ByVal DestY As Long, _ ByVal DestW As Long, _ ByVal DestH As Long, _ ByVal hImage As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal Width As Long, _ ByVal Height As Long, _ ByVal Size As Long) Dim hGraphics As Long Dim Sx2 As Long Sx2 = Size * 2 If GdipCreateFromHDC(DestHdc, hGraphics) = 0 Then Call GdipSetInterpolationMode(hGraphics, InterpolationModeNearestNeighbor) Call GdipSetPixelOffsetMode(hGraphics, PixelOffsetModeHalf) GdipDrawImageRectRectI hGraphics, hImage, DestX, DestY, Size, Size, x, y, Size, Size, &H2, 0&, 0&, 0& 'TOP_LEFT GdipDrawImageRectRectI hGraphics, hImage, DestX + Size, DestY, DestW - Sx2, Size, x + Size, y, Width - Sx2, Size, &H2, 0&, 0&, 0& 'TOP_CENTER GdipDrawImageRectRectI hGraphics, hImage, DestX + DestW - Size, DestY, Size, Size, x + Width - Size, y, Size, Size, &H2, 0&, 0&, 0& 'TOP_RIGHT GdipDrawImageRectRectI hGraphics, hImage, DestX, DestY + Size, Size, DestH - Sx2, x, y + Size, Size, Height - Sx2, &H2, 0&, 0&, 0& 'MID_LEFT GdipDrawImageRectRectI hGraphics, hImage, DestX + Size, DestY + Size, DestW - Sx2, DestH - Sx2, x + Size, y + Size, Width - Sx2, Height - Sx2, &H2, 0&, 0&, 0& 'MID_CENTER GdipDrawImageRectRectI hGraphics, hImage, DestX + DestW - Size, DestY + Size, Size, DestH - Sx2, x + Width - Size, y + Size, Size, Height - Sx2, &H2, 0&, 0&, 0& 'MID_RIGHT GdipDrawImageRectRectI hGraphics, hImage, DestX, DestY + DestH - Size, Size, Size, x, y + Height - Size, Size, Size, &H2, 0&, 0&, 0& 'BOTTOM_LEFT GdipDrawImageRectRectI hGraphics, hImage, DestX + Size, DestY + DestH - Size, DestW - Sx2, Size, x + Size, y + Height - Size, Width - Sx2, Size, &H2, 0&, 0&, 0& 'BOTTOM_CENTER GdipDrawImageRectRectI hGraphics, hImage, DestX + DestW - Size, DestY + DestH - Size, Size, Size, x + Width - Size, y + Height - Size, Size, Size, &H2, 0&, 0&, 0& 'BOTTOM_RIGHT Call GdipDeleteGraphics(hGraphics) End If End Sub Private Sub RenderPlusFromFile(ByVal DestHdc As Long, _ ByVal DestX As Long, _ ByVal DestY As Long, _ ByVal DestW As Long, _ ByVal DestH As Long, _ ByVal FileName As String, _ ByVal x As Long, _ ByVal y As Long, _ ByVal Width As Long, _ ByVal Height As Long, _ ByVal Size As Long) Dim hImg As Long Call GdipLoadImageFromFile(StrPtr(FileName), hImg) Call RenderStretchPlus(DestHdc, DestX, DestY, DestW, DestH, hImg, x, y, Width, Height, Size) Call GdipDisposeImage(hImg) End Sub Private Sub InitGDI() Dim GdipStartupInput As GDIPlusStartupInput GdipStartupInput.GdiPlusVersion = GdiPlusVersion Call GdiplusStartup(GdipToken, GdipStartupInput, ByVal 0) End Sub Private Sub TerminateGDI() Call GdiplusShutdown(GdipToken) End Sub Private Sub Command1_Click() Cls RenderPlusFromFile Me.hdc, 5, 5, 230, 230, App.Path & "\Image2.png", 0, 0, 158, 93, 26 End Sub Private Sub Form_Load() Call InitGDI Call GdipLoadImageFromFile(StrPtr(App.Path & "\BotonesVista.png"), m_hImage) Me.AutoRedraw = True 'Utilizando GDIPlus + AutoRedraw = True, es mas rapido End Sub Private Sub Form_Terminate() Call GdipDisposeImage(m_hImage) Call TerminateGDI End Sub Private Sub Option1_Click(Index As Integer) Cls RenderStretchPlus Me.hdc, 10, 10, 120, 80, m_hImage, 0, 21 * Index, 11, 21, 3 End Sub
|
|
RenderStretchPlus.zip 11 Kb Descargado 99 veces |
