DirectX 선그리기

DirectX 선그리기…

VertexBuffer 말고 다른 방법으로 선을 그리고 싶었다…

ID3DXLine 이란것이 있었따!!
D3DXVECTOR3 p[3];
p[0].x =0; p[0].y = 0; p[0].z = 0.0f;
p[1].x =0.1; p[1].y = 1; p[1].z = 0.0f;
p[2].x =2; p[2].y = 0; p[2].z = 0.0f;
p는 오브젝트의 월드공간에 있어야함
—————————————————————————-
Device->BeginScene();
ID3DXLine *Line;
D3DXCreateLine(Device, &Line);
Line->SetWidth(width);
Line->SetAntialias(true);
Line->Begin();
Line->DrawTransform(p, 3, &(worldMat*viewMat*projMat), D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f));    //이때의 행렬은 전체월드행렬*뷰*프로젝션 행렬을 넘겨줘야함
Line->End();
Line->Release();
Device->EndScene();

Up2Bottom and Left2Right Sorting Algorithm

// ========================================================
// Up2Bottom and Left2Right Sorting Algorithm
// addressing (weakly) sparse rectangles
// —
// Usage: Select the objects, then run the script
// Target: InDesign CS4/CS5/CS6/CC
// ========================================================

const CS = +CoordinateSpaces.SPREAD_COORDINATES,
AP_MIN = +AnchorPoint.TOP_LEFT_ANCHOR,
AP_CENTER = +AnchorPoint.CENTER_ANCHOR,
AP_MAX = +AnchorPoint.BOTTOM_RIGHT_ANCHOR;

var sel = app.properties.selection || null,
data = [],
r, i, j, k, t, n, w, vMax;

if( sel && 1 < (n=sel.length) ) { // Collect coordinates and IDs // --> {min:[xLeft, yTop], weight:[x,y], max:[xRight,yBottom], id}[]
for(i=0 ; i < n && (t=sel[i]) ; ++i ) { data[i] = { min: t.resolve(AP_MIN,CS)[0], weight: t.resolve(AP_CENTER,CS)[0], max: t.resolve(AP_MAX,CS)[0], id: t.id }; } // Find rows and columns [i.e. y-weights and x-weights] // --- for( j=0 ; j < 2 ; ++j ) { // Sort by center coordinate // --- data.sort(function(a,b){return a.weight[j] - b.weight[j]}); // min > max ==> w++
// —
for(vMax=(t=data[0]).max[j], t.weight[j]=(w=0), i=1 ; (i < n)&&(t=data[i]) ; ++i ) { if( t.min[j] > vMax ){ ++w; vMax=t.max[j]; }
t.weight[j] = w;
}
}

// Compute final weights, clean up data, create ID-to-weight access
// —
for( i=0 ; (i < n)&&(t=data[i]) ; ++i ) { w = n*t.weight[1] + t.weight[0]; // final weight (y first) k = '_'+t.id; // ID key (t.min.length=0)||(t.weight.length=0)||(t.max.length=0); delete t.min; delete t.weight; delete t.max; delete t.id; delete data[i]; data[k] = w; // ID-to-weight } // Apply sort --> r
// —
r = sel.sort(function(a,b){return data[‘_’+a.id]-data[‘_’+b.id];});

// Show the resulting order
// —
for( i=0 ; i < n ; ++i ) { app.select(r[i]); $.sleep(1000); } }

[MFC] CTreeCtrl 자식 아이템 체크/ 해제

CTreeCtrl 을 사용해서 체크박스를 단후 체크박스를 체크 하면 자식들도 모두 체크 하거나 체크 해제 하고 싶을 경우가 있는데. 이럴때 다음과 같은 방법으로 자식 노드를 재귀호출하여 체크/해제 할수 있다.

먼저 클릭 이벤트를 만들다. 핸들러는 TVN 게열과 NM 계열이 있는데 . 해당 체크 박스를 좌클릭 했을때 자식아이템을 쳌,/ 해제 하기를 원하기 때문에 NM_CLICK 이벤트를 선택한다.

코드는 다음과 같이 한다.

[cpp]
//
// CTreeCtrl에 왼쪽 마우스 이벤트가 발생했을 경우
// 이벤트가 발생한 좌표에 트리아이템이 존재하고 체크박스가 체크된 경우
// 정해진 작업을 수행한다.
//
void [CMainClass]::OnNMClickTreeDevices(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;

CPoint point;
UINT nFlags = 0;

GetCursorPos(&point);
::ScreenToClient(m_ctrlTree.m_hWnd, &point);

HTREEITEM hItem = m_ctrlTree.HitTest(point, &nFlags);

// 아이템이 존재하고 체크박스에 이벤트가 발생했다면
if (hItem != NULL && (nFlags & TVHT_ONITEMSTATEICON) != 0)
{
// 해당 아이템이 체크되어 있다면
if (m_ctrlTree.GetCheck(hItem))
{
UnCheckChildItems(hItem);
}
// 해당 아이템이 체크되어 있지 않다면
else
{
CheckChildItems(hItem);
}
}
}

[/cpp]
[cpp]
//
//
// 입력받은 트리아이템의 자식아이템들을 모두 체크한다.
//
void [CMainClass]::CheckChildItems(HTREEITEM hItem)
{
HTREEITEM hChildItem = m_ctrlTree.GetChildItem(hItem);

while (hChildItem != NULL)
{
m_ctrlTree.SetCheck(hChildItem, TRUE);

if (m_ctrlTree.ItemHasChildren(hChildItem))
{
CheckChildItems(hChildItem);
}

hChildItem = m_ctrlTree.GetNextItem(hChildItem, TVGN_NEXT);
}
}

[/cpp]
[cpp]
//
//
// 입력받은 트리아이템의 자식아이템들을 모두 체크 해제한다.
//
void [CMainClass]::UnCheckChildItems(HTREEITEM hItem)
{
HTREEITEM hChildItem = m_ctrlTree.GetChildItem(hItem);

while (hChildItem != NULL)
{
m_ctrlTree.SetCheck(hChildItem, FALSE);

if (m_ctrlTree.ItemHasChildren(hChildItem))
{
UnCheckChildItems(hChildItem);
}

hChildItem = m_ctrlTree.GetNextItem(hChildItem, TVGN_NEXT);
}
}

[/cpp]

VC++ warning C4482: 해결

warning C4482: 비표준 확장이 사용되었습니다. 정규화된 이름에 ‘…’ 열거형을 사용했습니다.

이 경고 메세지는 형식 내부(클래스, 구조체, 네임스페이스 등)에 선언된 이름있는 enum(열거형)을 사용하게 되었을 때 나타나는 증상입니다.

– 해결 방법
잘못된 방법 : classname::enumname::__temp
잘된 방법 : classname::__temp

CString to String & String to CString


[CString to string]




CString CfilePath=_T(“abcavc”);


std::string filePath((LPSTR)(LPCTSTR)CfilePath); <- 이렇게 했더니 제대로 안뜸!!!


CT2CA pszConvertedAnsiString (CfilePath);


std::string filePath(pszConvertedAnsiString);


과 같이 바꿔주어야 한다!



[string to CString]


std::string str = “Hello”;


CString Cstr(str.c_str());