Mersi.
http://a.imagehost.org/0303/diagrame.png (scuze, dar n-am stiut cum altfel sa pun poza, tinand cont ca era un pic cam maricica)
Edit: CWindowDC, nu CDC

E facubila, nu te lasa!adi0149 wrote: E facubila treaba, sau sa ma las?
Code: Select all
void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(rc);
dc.Ellipse(rc);
// etc...
}
Code: Select all
myDC = GetDlgItem(IDC_TEST)->GetDC();
CRect rect;
GetDlgItem(IDC_TEST)->GetWindowRect(&rect);
ScreenToClient(&rect);
myDC->DrawTextW(_T("TEEEEEEEEEEEEEEEEEXT"),20,rect,0); // unde CDC *myDC;
CPoint points[1000],points2[2001],points3[1000]; int count=0;
for (float i=0; i<M_PI; i=i+0.001*M_PI)
{
points[count].x=100+10*sinf(i);
points[count].y=100+10*cosf(i);
points3[count].x=100+(10-(15*cosf(i)+25)*sinf(i))*sinf(i);
points3[count].y=100+(10-(15*cosf(i)+25)*sinf(i))*cosf(i);
count++;
}
myDC->Polyline(points,1000);
myDC->Polyline(points3,1000);
Pai, dialogul devine vizibil si implicit se picteaza cu ce vrea el abia dupa ce iese in OnInitDialog.adi0149 wrote:Am incercat asa:
Am facut o fereastra de dialog maaaare (IDD_TEST_DLG) si in ea am pus un GroupBox (IDC_TEST) tot foarte mare (sa fiu sigur ca nu desenez pe langa).
Apoi, in OnInitDialog al lui TestDlg, am bagat
[...]
Am incercat sa printez si text, si polylinii, nu se vede nimic.
Never ever call OnPaint!adi0149 wrote:Fac o clasa care sa deseneze intr-un control static, iar apoi incerc sa chem OnPaint in clasa dialogului meu, atribuindu-i IDC-ul controlului in care vreau sa apara desenul (Group Box sau Picture Control).
Code: Select all
void CTestDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CPoint PtLine[] = { CPoint( 50, 50), CPoint(670, 50),
CPoint(670, 310), CPoint(490, 310),
CPoint(490, 390), CPoint(220, 390),
CPoint(220, 310), CPoint( 50, 310),
CPoint( 50, 50) };
dc.MoveTo(PtLine[0]);
dc.LineTo(PtLine[1]);
dc.LineTo(PtLine[2]);
dc.LineTo(PtLine[3]);
dc.LineTo(PtLine[4]);
dc.LineTo(PtLine[5]);
dc.LineTo(PtLine[6]);
dc.LineTo(PtLine[7]);
dc.LineTo(PtLine[8]);
}
Code: Select all
void CTestDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetDlgItem(IDC_STATIC_TEST)->GetWindowRect(&rect); // Unde IDC_STATIC_TEST e IDul controlului static de tip Group Box
ScreenToClient(&rect);
CPoint points[1000]; int count=0;
for (float i=0; i<M_PI; i=i+0.001*M_PI) // bucla pentru desenarea unui semicerc cu centrul in centrul controlului
{ //si cu raza fiind minimul dintre rec.Height si rec. Width supra 3.
points[count].x=rect.CenterPoint().x+(min((float)rect.Width(),(float)rect.Height())/(3.0f))*sinf(i);
points[count].y=rect.CenterPoint().y+(min((float)rect.Width(),(float)rect.Height())/(3.0f))*cosf(i);
count++;
}
dc.Polyline(points,1000);
}
derivezi o clasa din CStatic, la fel ON_WM_PAINT si cu staticul, si folosit in dialog.adi0149 wrote:A... m-am prins... Uitam sa declar ON_WM_PAINT(). Merge acum![]()
Ar mai fi ceva... pot sa fac in asa fel incat device contextul sa nu fie fereastra de dialog, ci un static control din ea? Adica... daca printez un punct in 0,0 sa nu fie in stanga sus al ferestrei, ci in stanga sus al controlului.
Mersi.
Code: Select all
#pragma once
// CDiagramCtrl
class CDiagramCtrl : public CStatic
{
DECLARE_DYNAMIC(CDiagramCtrl)
public:
CDiagramCtrl();
virtual ~CDiagramCtrl();
virtual void OnFinalRelease();
float teta;
CRect rect;
int nID;
void DrawPipe(CPaintDC PDC, CRect rect);
void DrawPositionLine(CPaintDC PDC, CRect rect, float teta);
protected:
float GetRadius(CRect rect);
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};
Code: Select all
// DiagramCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "PipeDoctor.h"
#include "DiagramCtrl.h"
#include "math.h"
#define M_PI 3.14159265358979323846 // PI
#define M_1_PI 0.318309886183790671538 // 1/PI
// CDiagramCtrl
IMPLEMENT_DYNAMIC(CDiagramCtrl, CStatic)
CDiagramCtrl::CDiagramCtrl()
{
#ifndef _WIN32_WCE
EnableActiveAccessibility();
#endif
EnableAutomation();
}
CDiagramCtrl::~CDiagramCtrl()
{
}
void CDiagramCtrl::OnFinalRelease()
{
CStatic::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CDiagramCtrl, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CDiagramCtrl, CStatic)
END_DISPATCH_MAP()
// {C3156248-B41B-4A03-851C-86F6290E09B8}
static const IID IID_IDiagramCtrl =
{ 0xC3156248, 0xB41B, 0x4A03, { 0x85, 0x1C, 0x86, 0xF6, 0x29, 0xE, 0x9, 0xB8 } };
BEGIN_INTERFACE_MAP(CDiagramCtrl, CStatic)
INTERFACE_PART(CDiagramCtrl, IID_IDiagramCtrl, Dispatch)
END_INTERFACE_MAP()
// CDiagramCtrl message handlers
void CDiagramCtrl::DrawPipe(CPaintDC PDC, CRect rect)
{
CPoint points[500];
int count=0;
for (float i=0; i<M_PI; i=i+(1.0f/500)*M_PI)
{
points[count].x=rect.CenterPoint().x+GetRadius(rect)*sinf(i);
points[count].y=rect.CenterPoint().y+GetRadius(rect)*cosf(i);
count++;
}
PDC.Polyline(points,500);
}
void CDiagramCtrl::DrawPositionLine(CPaintDC PDC, CRect rect, float teta)
{
CPoint points[2];
float xc = rect.CenterPoint().x, yc = rect.CenterPoint().y;
points[0].x=xc;
points[0].y=yc;
points[1].x=xc+sinf(teta)*GetRadius(rect);
points[1].y=yc+cosf(teta)*GetRadius(rect);
//HPEN hpen = CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
PDC.MoveTo(points[0]);
PDC.LineTo(points[1]);
//DeleteObject(hpen);
}
float CDiagramCtrl::GetRadius(CRect rect)
{
return (min((float)rect.Width(),(float)rect.Height())/(3.0f));
}
void CDiagramCtrl::OnPaint()
{
CPaintDC PDC(this);
GetDlgItem(nID)->GetWindowRect(&rect);
ScreenToClient(&rect);
DrawPipe(PDC,rect);
DrawPositionLine(PDC,rect,teta);
}
Code: Select all
CPaintDC dc(this);
m_Diagram.nID = IDC_AXIAL_DIAGRAMS;
GetDlgItem(IDC_AXIAL_DIAGRAMS)->GetWindowRect(&m_Diagram.rect);
ScreenToClient(&m_Diagram.rect);
m_Diagram.Create(_T(""), WS_CHILD | WS_VISIBLE ,m_Diagram.rect,parent,IDC_AXIAL_DIAGRAMS);
Fara stack trace nu cred ca te poate ajuta cineva.adi0149 wrote:Incerc sa creez controlul static facut in clasa CDiagramCtrl, in CDiagramsDlg::OnInitDialog() asa:compileaza, dar cand rulez si incerc sa deschid fereastra crapa:Code: Select all
CPaintDC dc(this); m_Diagram.nID = IDC_AXIAL_DIAGRAMS; GetDlgItem(IDC_AXIAL_DIAGRAMS)->GetWindowRect(&m_Diagram.rect); ScreenToClient(&m_Diagram.rect); m_Diagram.Create(_T(""), WS_CHILD | WS_VISIBLE ,m_Diagram.rect,parent,IDC_AXIAL_DIAGRAMS);