H
Hallo.
Habe bis zum Abwinken auch alles probiert, damit mein Text überhaupt erscheint.
Es scheint so, daß die wgl-Dinger mit ATL aus irgendwelchen Gründen auch immer nicht funzen können ...
Also funktioniert weder mit wglUseFontBitmaps() noch mit wglUseFontOutlines().
Ich hoffe jedoch, ich irre mich, weil auch ich das brauche...
Kann jemand bitte helfen ?
// MyControl.h : Declaration of the CMyControl
#pragma once
#include "resource.h" // main symbols
#include <atlctl.h>
#include "MyProject.h"
// CMyControl
class ATL_NO_VTABLE CMyControl :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IMyControl, &IID_IMyControl, &LIBID_MyProjectLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<CMyControl>,
public IOleControlImpl<CMyControl>,
public IOleObjectImpl<CMyControl>,
public IOleInPlaceActiveObjectImpl<CMyControl>,
public IViewObjectExImpl<CMyControl>,
public IOleInPlaceObjectWindowlessImpl<CMyControl>,
public ISupportErrorInfo,
public IPersistStorageImpl<CMyControl>,
public ISpecifyPropertyPagesImpl<CMyControl>,
public IQuickActivateImpl<CMyControl>,
public IDataObjectImpl<CMyControl>,
public IProvideClassInfo2Impl<&CLSID_MyControl, NULL, &LIBID_MyProjectLib>,
public CComCoClass<CMyControl, &CLSID_MyControl>,
public CComControl<CMyControl>
{
public:
CMyControl():
m_uiListBase(0)
{
m_bWindowOnly = TRUE;
}
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
OLEMISC_CANTLINKINSIDE |
OLEMISC_INSIDEOUT |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST
)
DECLARE_REGISTRY_RESOURCEID(IDR_MYCONTROL)
BEGIN_COM_MAP(CMyControl)
COM_INTERFACE_ENTRY(IMyControl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()
BEGIN_PROP_MAP(CMyControl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
BEGIN_MSG_MAP(CMyControl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
CHAIN_MSG_MAP(CComControl<CMyControl>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
{
static const IID* arr[] =
{
&IID_IMyControl,
};
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i], riid))
return S_OK;
}
return S_FALSE;
}
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// IMyControl
public:
HRESULT OnDraw(ATL_DRAWINFO& di)
{
HDC hdc = di.hdcDraw;
RECT& rc = *(RECT*)di.prcBounds;
wglMakeCurrent(hdc, m_hRC);
glClearColor(.6f, .6f, .6f, 10.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
#if 0
glPushMatrix();
// compute dimensions of a quarter of the control
SIZE qtrSize = { (rc.right - rc.left) / 2, (rc.bottom - rc.top) / 2 };
glBegin(GL_QUADS);
glColor3ub(255, 0, 0);
glVertex3s(-qtrSize.cx, -qtrSize.cy, 0);
glColor3ub(0, 255, 0);
glVertex3s(qtrSize.cx, -qtrSize.cy, 0);
glColor3ub(0, 0, 255);
glVertex3s(qtrSize.cx, qtrSize.cy, 0);
glColor3ub(255, 255, 255);
glVertex3s(-qtrSize.cx, qtrSize.cy, 0);
glEnd();
glPopMatrix();
#endif
glColor3f(0.0, 1.0, 1.0);
glPointSize(6.0);
glBegin(GL_POINTS);
glVertex3f(0.0, 0.0, 0.0);
glEnd();
glColor3f(1.0, 0.0, 0.0);
glListBase(m_uiListBase);
// Es funktioniert nicht:
//PrintGLText("Test123456");
// Unten funktionieren auch nicht ... :
glCallLists (24, GL_UNSIGNED_BYTE, "Hello Win32 OpenGL World");
DWORD dw = GetLastError();
for (int n=32; n < 255; n++)
glCallList(n);
glPointSize(2.0);
glBegin(GL_POINTS);
glVertex3f(2.0, 0.0, 0.0);
glEnd();
glFinish();
SwapBuffers(wglGetCurrentDC());
return S_OK;
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
// Set OpenGL pixel format for given DC
BOOL SetupPixelFormat(HDC hdc)
{
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0)
{
ATLASSERT(FALSE);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE)
{
ATLASSERT(FALSE);
return FALSE;
}
return TRUE;
}
// Create rendering context given device context and control bounds
void CreateContext(HDC hdc, RECT& rc)
{
PIXELFORMATDESCRIPTOR pfd;
if (!SetupPixelFormat(hdc))
return;
int n = GetPixelFormat(hdc);
DescribePixelFormat(hdc, n, sizeof(pfd), &pfd);
m_hRC = wglCreateContext(hdc);
wglMakeCurrent(hdc, m_hRC);
// OpenGL stuff starts here
int width = rc.right - rc.left;
int height = rc.bottom - rc.top;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluOrtho2D(-width/2, width/2, -height/2, height/2);
float flMax = 3.0f;
glOrtho(-flMax, flMax, -flMax, flMax, -flMax, flMax);
glMatrixMode(GL_MODELVIEW);
}
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
HDC hdc = GetDC();
RECT rc;
GetClientRect(&rc);
CreateContext(hdc, rc);
/******************/
/* Added by hdWin */
/******************/
HDC hDC(NULL);
hDC = GetDC();
HFONT hFont (NULL), hOldFont (NULL); // Windows Font ID
m_uiListBase = glGenLists(256); // Storage For 256 Characters
hFont = CreateFont( -12, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
FW_BOLD, // Font Weight
FALSE, // Italic
FALSE, // Underline
FALSE, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
"Comic Sans MS"); // Font Name
hOldFont = (HFONT)SelectObject(hDC, hFont);
ZeroMemory(m_gmf, sizeof(m_gmf));
// MSDN:
// The wglUseFontOutlines function creates a set of display lists !
//#define FONTOUTLINES
#ifdef FONTOUTLINES
BOOL bo = wglUseFontOutlines(
hDC, // Select The Current DC
0, // Starting Character
256, // Number Of Display Lists To Build
m_uiListBase, // Starting Display Lists
0.0f, // Deviation From The True Outlines
0.2f, // Font Thickness In The Z Direction
WGL_FONT_POLYGONS, // Use Polygons, Not Lines
m_gmf); // Address Of Buffer To Recieve Data
#endif
#define FONTBITMAPS
#ifdef FONTBITMAPS
BOOL bo = wglUseFontBitmaps(
hDC, 0, 256, m_uiListBase);
#endif
glCallLists (24, GL_UNSIGNED_BYTE, "Hello Win32 OpenGL World");
DeleteObject(SelectObject(hDC, hOldFont));
ReleaseDC(hDC);
hDC = NULL;
return 0;
}
LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
glDeleteLists(m_uiListBase, 256); // Delete All 256 Characters
wglMakeCurrent(NULL, NULL);
if (m_hRC)
{
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
return 0;
}
LRESULT CMyControl::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// when resized, recreate the device context
wglMakeCurrent(NULL, NULL);
if (m_hRC)
{
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
HDC hdc = GetDC();
RECT rc;
GetClientRect(&rc);
CreateContext(hdc, rc);
return 0;
}
void CMyControl::PrintGLText(const char *fmt, ...) // Custom GL "Print" Routine
{
float length=0; // Used To Find The Length Of The Text
char text[256]; // Holds Our String
va_list ap; // Pointer To List Of Arguments
if (fmt == NULL) // If There's No Text
return; // Do Nothing
va_start(ap, fmt); // Parses The String For Variables
sprintf(text, fmt, ap); // And Converts Symbols To Actual Numbers
va_end(ap); // Results Are Stored In Text
for (unsigned int loop=0;loop<(strlen(text));loop++) // Loop To Find Text Length
{
length += m_gmf[text[loop]].gmfCellIncX; // Increase Length By Each Characters Width
}
// glEnable(GL_CULL_FACE);
// glCullFace(GL_FRONT_AND_BACK);
// glPushMatrix();
//glTranslatef(-length/2,0.0f,0.0f); // Center Our Text On The Screen
const GLubyte* glubyte (NULL);
glubyte = gluErrorString(glGetError());
glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits
glListBase(m_uiListBase); // Sets The Base Character to 0
glCallLists((GLsizei)strlen(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text
DWORD dw = GetLastError();
glubyte = gluErrorString(glGetError());
glPopAttrib(); // Pops The Display List Bits
// glPopMatrix();
// glDisable(GL_CULL_FACE);
}
// OpenGL rendering context
HGLRC m_hRC;
STDMETHOD(RefreshCtrl)(void);
/******************/
/* Added by hdWin */
/******************/
GLYPHMETRICSFLOAT m_gmf[256]; // Storage For Information About Our Outline Font Characters
GLuint m_uiListBase;
};
OBJECT_ENTRY_AUTO(__uuidof(MyControl), CMyControl)