Nume resursa dialog

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Nume resursa dialog

Post by mesajflaviu » 29 Nov 2010, 12:32

Am o problema ciudata : intr-o aplicatie SDI , cu view-ul bazat pe CView , creez in
CMyView::OnCreate(...) :

Code: Select all

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if(CView::OnCreate(lpCreateStruct) == -1)return -1;

	// TODO: Add your specialized creation code here

	DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_REPORT;

	BOOL bResult = m_List1.Create(dwStyle,CRect(0,0,0,0),this,IDC_LIST1);

	return (bResult ? 0 : -1);
}
in care m_List1 este de tip CListCtrlEx ( derivata din CListCtrl ).

In MyView::OnSize(...) am :

Code: Select all

void CMyView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);

	// TODO: Add your message handler code here

	if(::IsWindow(m_List1.m_hWnd))m_List1.MoveWindow(0,0,cx,cy,TRUE);
}
si totul functioneaza OK .

Pentru a salva latimea coloanelor listei in registrii , in CListCtrlEx incerc sa aflu numele resursei CListCtrlEx creata dinamic , in acest caz ID_LIST1 :

Code: Select all

void CListCtrlEx::SaveState()
{
	CString sListName;
	sListName.LoadString(GetDlgCtrlID());
        AfxMessageBox(sListName);
}
dar , surpriza , sListName este gol ! De ce ?



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Nume resursa dialog

Post by Marius Bancila » 29 Nov 2010, 14:41

Pai ai putea elimina surpriza daca ai verifica ce-ti intoarce GetDlgCtrlID() si daca exista un string in resurse cu acelasi ID. Ma indoiesc. Nu inteleg de ce ai nevoie de nume.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Nume resursa dialog

Post by Silviu Ardelean » 29 Nov 2010, 14:50

De fapt, tu vrei sa obtii latimea unei anumite coloane pentru a o salva in registrii?
Daca da, de ce te complici inutil?

Code: Select all

	int col_width =	m_List1.GetColumnWidth(col_index); // daca e lista din view-ul tau 
Nu inteleg ce are de-a face "resura dialog" cu view-ul. Poti sa ne dai mai multe detalii la ce te-ai referit?

Si ca idee, daca tot vrei sa ai view-ul de tip List iti recomand sa ai clasa de view derivata din CListView.
Apoi, prin codul tau obtii latimea asa:

Code: Select all

CListCtrl *pList = &GetListCtrl();
int col_width =	pList->GetColumnWidth(col_index);

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Nume resursa dialog

Post by mesajflaviu » 29 Nov 2010, 15:50

Marius Bancila wrote:Pai ai putea elimina surpriza daca ai verifica ce-ti intoarce GetDlgCtrlID() si daca exista un string in resurse cu acelasi ID. Ma indoiesc. Nu inteleg de ce ai nevoie de nume.
GetDlgCtrlID imi intoarce ID-ul 1001 ... dar as vrea s-l convertesc in string pentru a putea face un folder in registrii cu numele list-control-ului ...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Nume resursa dialog

Post by mesajflaviu » 29 Nov 2010, 15:54

Silviu Ardelean wrote:De fapt, tu vrei sa obtii latimea unei anumite coloane pentru a o salva in registrii?
Daca da, de ce te complici inutil?

Code: Select all

	int col_width =	m_List1.GetColumnWidth(col_index); // daca e lista din view-ul tau 
Nu inteleg ce are de-a face "resura dialog" cu view-ul. Poti sa ne dai mai multe detalii la ce te-ai referit?

Si ca idee, daca tot vrei sa ai view-ul de tip List iti recomand sa ai clasa de view derivata din CListView.
Apoi, prin codul tau obtii latimea asa:

Code: Select all

CListCtrl *pList = &GetListCtrl();
int col_width =	pList->GetColumnWidth(col_index);
Latimea coloanelor din lista am aflat-o in felul urmator :

Code: Select all

	TCHAR szName[256];
	LVCOLUMN lvColumnInfo;
	ZeroMemory(&lvColumnInfo,sizeof(lvColumnInfo));
	lvColumnInfo.mask = LVCF_TEXT;
	lvColumnInfo.pszText = szName;
	lvColumnInfo.cchTextMax = sizeof(szName) - 1;
  GetColumn(0,&lvColumnInfo);    // presupun ca am cel putin o coloana
        TRACE("\n %s \n",lvColumnInfo.pszText);
CListView-ul standard nu este suficient in acest caz , CListCtrlEx-ul ordoneaza , poate edita , etc.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Nume resursa dialog

Post by mesajflaviu » 29 Nov 2010, 15:59

Bine , pana la urma pot face :

Code: Select all

CString sListName;
sListName.Format("%d",GetDlgCtrlID());
dar ma gandeam ca pot converti acest ID in string ...

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Nume resursa dialog

Post by Silviu Ardelean » 29 Nov 2010, 16:09

Ce are de-a face latimea textului dintr-o coloana cu latimea efectiva a coloanei? Tu vorbesti de mere si culegi pere (textul din headerul coloanei). :)
Daca vrei sa faci asa, pentru aflarea latimii coloanei in pixel folosesti atributul cx al structurii LVCOLUMN.

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Nume resursa dialog

Post by cristianamarie » 29 Nov 2010, 16:20

sListName.LoadString(GetDlgCtrlID());
nu are sens. Practic, LoadString inseamna LoadResource de tipul RT_STRING. Ori la tine GetDlgCtrlID e un ID de resource (control dintr-un dialog).
Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Nume resursa dialog

Post by mesajflaviu » 30 Nov 2010, 00:26

Silviu Ardelean wrote:Ce are de-a face latimea textului dintr-o coloana cu latimea efectiva a coloanei? Tu vorbesti de mere si culegi pere (textul din headerul coloanei). :)
Daca vrei sa faci asa, pentru aflarea latimii coloanei in pixel folosesti atributul cx al structurii LVCOLUMN.
Silviu , ai dreptate , eu vorbeam de latimea coloanei si in codul pus pe forum am adus textul de pe coloane ...

Code: Select all

void CListCtrlEx::SaveState()
{
	CString sListName;
	sListName.Format("%d",GetDlgCtrlID());

	int nColumnCount = 0;
	CHeaderCtrl* pHeader = GetHeaderCtrl();
	if(pHeader != NULL)nColumnCount = pHeader->GetItemCount();

	TCHAR szName[256];
	LVCOLUMN lvColumnInfo;
	ZeroMemory(&lvColumnInfo,sizeof(lvColumnInfo));
	lvColumnInfo.mask = LVCF_TEXT | LVCF_WIDTH;
	lvColumnInfo.pszText = szName;
	lvColumnInfo.cchTextMax = sizeof(szName) - 1;

	CWinApp* pApp = (CWinApp*)AfxGetApp();

	for(int i = 0;i < nColumnCount;++i)
	{
		GetColumn(i,&lvColumnInfo);
		pApp->WriteProfileInt(sListName,lvColumnInfo.pszText,lvColumnInfo.cx);
	}
}

Post Reply