Graphics.GetHdc Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Obtém o identificador para o contexto do dispositivo associado a esse Graphics.
public:
virtual IntPtr GetHdc();
public:
IntPtr GetHdc();
public IntPtr GetHdc ();
abstract member GetHdc : unit -> nativeint
override this.GetHdc : unit -> nativeint
member this.GetHdc : unit -> nativeint
Public Function GetHdc () As IntPtr
Retornos
nativeint
Manipule para o contexto do dispositivo associado a esse Graphics.
Implementações
Exemplos
O exemplo de código a seguir foi projetado para uso com o Windows Forms e requer PaintEventArgse
, que é um parâmetro do manipulador de eventos Paint. O exemplo ilustra a chamada de uma função GDI do Windows para executar a mesma tarefa que um método de Graphics GDI+. O código executa as seguintes ações:
Define o atributo DllImportAttribute de interoperabilidade para o arquivo DLL do Windows gdi32.dll. Essa DLL contém a função GDI desejada.
Define a função Rectangle nessa DLL como externa.
Cria uma caneta vermelha.
Com a caneta, desenha um retângulo para a tela usando o método de DrawRectangle GDI+.
Define uma variável de tipo de ponteiro interno
hdc
e define seu valor como o identificador para o contexto do dispositivo do formulário.Desenha um retângulo para a tela usando a função Rectangle GDI.
Libera o contexto do dispositivo representado pelo parâmetro
hdc
.
private:
[System::Runtime::InteropServices::DllImportAttribute("gdi32.dll")]
static bool Rectangle( IntPtr hdc, int ulCornerX, int ulCornerY, int lrCornerX, int lrCornerY );
public:
void GetHdcForGDI1( PaintEventArgs^ e )
{
// Create pen.
Pen^ redPen = gcnew Pen( Color::Red,1.0f );
// Draw rectangle with GDI+.
e->Graphics->DrawRectangle( redPen, 10, 10, 100, 50 );
// Get handle to device context.
IntPtr hdc = e->Graphics->GetHdc();
// Draw rectangle with GDI using default pen.
Rectangle( hdc, 10, 70, 110, 120 );
// Release handle to device context.
e->Graphics->ReleaseHdc( hdc );
}
public class GDI
{
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern bool Rectangle(
IntPtr hdc,
int ulCornerX, int ulCornerY,
int lrCornerX, int lrCornerY);
}
private void GetHdcForGDI1(PaintEventArgs e)
{
// Create pen.
Pen redPen = new Pen(Color.Red, 1);
// Draw rectangle with GDI+.
e.Graphics.DrawRectangle(redPen, 10, 10, 100, 50);
// Get handle to device context.
IntPtr hdc = e.Graphics.GetHdc();
// Draw rectangle with GDI using default pen.
GDI.Rectangle(hdc, 10, 70, 110, 120);
// Release handle to device context.
e.Graphics.ReleaseHdc(hdc);
}
Public Class GDI
<System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")> _
Friend Shared Function Rectangle(ByVal hdc As IntPtr, _
ByVal ulCornerX As Integer, ByVal ulCornerY As Integer, ByVal lrCornerX As Integer, _
ByVal lrCornerY As Integer) As Boolean
End Function
End Class
<System.Security.Permissions.SecurityPermission( _
System.Security.Permissions.SecurityAction.LinkDemand, Flags:= _
System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Private Sub GetHdcForGDI1(ByVal e As PaintEventArgs)
' Create pen.
Dim redPen As New Pen(Color.Red, 1)
' Draw rectangle with GDI+.
e.Graphics.DrawRectangle(redPen, 10, 10, 100, 50)
' Get handle to device context.
Dim hdc As IntPtr = e.Graphics.GetHdc()
' Draw rectangle with GDI using default pen.
GDI.Rectangle(hdc, 10, 70, 110, 120)
' Release handle to device context.
e.Graphics.ReleaseHdc(hdc)
End Sub
Comentários
O contexto do dispositivo é uma estrutura do Windows baseada em GDI que define um conjunto de objetos gráficos e seus atributos associados, bem como os modos gráficos que afetam a saída. Esse método retorna esse contexto de dispositivo com exceção de uma fonte. Como uma fonte não está selecionada, as chamadas para o método FromHdc usando um identificador retornado do método GetHdc falharão.
As chamadas para os métodos GetHdc e ReleaseHdc devem aparecer em pares. Durante o escopo de um par de métodos GetHdc e ReleaseHdc, você geralmente faz apenas chamadas para funções GDI. As chamadas nesse escopo feitas aos métodos GDI+ do Graphics que produziram o parâmetro hdc
falham com um erro de ObjectBusy
. Além disso, o GDI+ ignora as alterações de estado feitas no Graphics do parâmetro hdc
em operações subsequentes.