Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2009, 15:17   #1
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию listbox

начал изучать WinAPI в связи с чем возникают небольшие вопросики

в основном окне нужно создать listbox и заполнить его

делаю вот так

Код:
LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{
    HDC hDC; 
    PAINTSTRUCT ps; 
    RECT rect; 
		
	wchar_t s[]=L"sdf";
			
	switch (msg)
	{
	    case WM_CREATE :ListBox1 = CreateWindowEx(IDD_LIST,L"LISTBOX",L"list1",
                                                            WS_CHILD | WS_VISIBLE | LBS_EXTENDEDSEL | WS_BORDER | WS_VSCROLL,
                                                            20, 20,450, 200,hWnd,0, hInst,0);
			                     
			                  for(int i=0;i<10;i++)
				       {
				         SendDlgItemMessage(hWnd,0,LB_ADDSTRING,0,(LPARAM)s);
				       }
				       SendDlgItemMessage(hWnd,IDD_LIST,LB_SETCURSEL,0,0);
				       break;
		
	}
	return 0; 
}
listbox создается но не заполняется, помогите разобраться пожалуйста
counter вне форума Ответить с цитированием
Старый 30.01.2009, 17:42   #2
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

используй просто SendMessage
Д'якон вне форума Ответить с цитированием
Старый 31.01.2009, 15:50   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

cпасибо, Д'якон
counter вне форума Ответить с цитированием
Старый 31.01.2009, 18:47   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Пользуясь случаем(и дабы не учинять топик-флуд) задам свой вопрос.
Хотелось бы увидеть код (желательно на С++ или MASM) в которым бы перехватывалось событие LB_SELCHANGE. Сколько не пробовал никак не получается... (Код правильный, но что то не так, вот что именно хотелось бы выяснить).
Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <TLHELP32.H>
#define hpList 1000
#define hpOpen 1001
#define hpidList 1002
static HWND hProcessList;
static HWND hPIDList;
static HWND hOpenProcess;
LRESULT WINAPI mainProc(HWND hWnd,UINT message,WPARAM wp,LPARAM lp);
bool fillProcessList(HWND hList,HWND hListID);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;
	HWND hMain=CreateWindowEx(0,WC_DIALOG,"Noname",WS_VISIBLE|WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT,172,250,0,0,0,0);
	SetWindowLong(hMain,DWL_DLGPROC,(long)mainProc);
	SendMessageA(hMain,WM_CREATE,0,0);
	while(GetMessage(&msg,0,0,0)!=NULL)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}
LRESULT WINAPI mainProc(HWND hWnd,UINT message,WPARAM wp,LPARAM lp)
{
	switch(message)
	{
	case WM_COMMAND:
		{
		if(HIWORD(wp)==hpList)
			MessageBox(0,"Hello world","",0);
		}break;
	case WM_CREATE:
		{
		char szText[]="Hello world";
		hProcessList=CreateWindowEx(0,"listbox",0,WS_VISIBLE|WS_CHILD,5,5,100,200,hWnd,(HMENU)hpList,0,0);
		for(int i=0;i<20;i++)
			SendMessageA(hProcessList,LB_ADDSTRING,0,(WPARAM)szText);
		}break;
	case WM_CLOSE:
		{
		PostQuitMessage(0);
		}break;
	}
	return 0;
}
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 31.01.2009, 18:57   #5
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Ну во-первых LBN_SELCHANGE. Чет я не нашел в Вашем коде перехват данного сообщения
Д'якон вне форума Ответить с цитированием
Старый 31.01.2009, 22:14   #6
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Это ведь неважно, этот LBN_SELCHANGE перехватывается в WM_COMMAND а туда ничего не поступает.. в обще ничего, только те команды которые поступают от других элементов управления. в старшем слове WPARAM 100% должен быть идентификатор а там его нет, я просто не понимаю почему listbox не отправляет ничего, ни notify ни сообщений... Приведите пожалуйста код который у вас скомпилировался в работоспособную программу по типу моей, то есть что бы при смене выбранного элемента выбивался MessageBox. Заранее благодарен.
PS: Версия компилятора и ОС тоже очень помогут.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 31.01.2009, 22:30   #7
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

В общем я не стал извращаться, а просто изменил пример Пирогова - пользуйся на здоровье
Вложения
Тип файла: rar 1.rar (5.7 Кб, 92 просмотров)

Последний раз редактировалось Д'якон; 31.01.2009 в 22:50.
Д'якон вне форума Ответить с цитированием
Старый 31.01.2009, 22:33   #8
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

В общем в lParam - идентификатор, а в HiWord wParam - действие над дочерним окном
if(lp==hpList) - вот так

Код:
WM_COMMAND wNotifyCode = HIWORD(wParam); 
  wID = LOWORD(wParam); 
  hwndCtl = (HWND) lParam

Последний раз редактировалось Д'якон; 31.01.2009 в 22:50.
Д'якон вне форума Ответить с цитированием
Старый 09.02.2009, 23:01   #9
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

есть rc файл ресурсов для диалога

Код:
#include<windows.h>
#include"resource.h"

FoundItem DIALOG DISCARDABLE 50,20,280,210

CAPTION "Found Item"
STYLE DS_MODALFRAME | WS_SYSMENU 
{
	DEFPUSHBUTTON "OK",IDD_OK,20,140,28,12
	PUSHBUTTON "Edit",IDD_DEL,69,140,28,12
	PUSHBUTTON "Delete",IDD_CANCEL,124,140,28,12
	PUSHBUTTON "Change foto",IDD_INFO,200,140,45,12
	EDITTEXT IDD_EDIT,50,10,100,12, ES_LEFT | WS_BORDER | WS_TABSTOP | ES_READONLY
	EDITTEXT IDD_EDIT_1,50,30,100,12, ES_LEFT | WS_BORDER | WS_TABSTOP | ES_READONLY
	EDITTEXT IDD_EDIT_2,50,50,100,12, ES_LEFT | WS_BORDER | WS_TABSTOP | ES_READONLY
	EDITTEXT IDD_EDIT_3,50,70,100,12, ES_LEFT | WS_BORDER | WS_TABSTOP | ES_READONLY
	EDITTEXT IDD_EDIT_4,50,90,100,12, ES_LEFT | WS_BORDER | WS_TABSTOP | ES_READONLY
	EDITTEXT IDD_EDIT_5,50,110,100,12, ES_LEFT | WS_BORDER | WS_TABSTOP | ES_READONLY
	LISTBOX IDD_LIST,20,165,245,35, WS_VISIBLE | LBS_DISABLENOSCROLL | LBS_STANDARD | LBS_NOTIFY
}
сей диалог вызывается из другого диалога

есть 2 варианта инициализации листбокса и ни один не работает

Код:
BOOL CALLBACK DialogFoundItem (HWND hFItem, UINT msgFItem,WPARAM wParam, LPARAM lParam)

{
	HDC hdcFItem;
	hdcFItem=GetDC(hFItem);
	TextOut(hdcFItem,40,24,L"Name   ",7);
	TextOut(hdcFItem,40,65,L"Phone  ",7);
	TextOut(hdcFItem,40,106,L"Adress ",7);
	TextOut(hdcFItem,40,147,L"E-Mail ",7);
	TextOut(hdcFItem,40,188,L"Site   ",7);
	TextOut(hdcFItem,40,229,L"Work   ",7);
	ReleaseDC(hFItem,hdcFItem);

			
	switch(msgFItem)
	{
	     case WM_INITDIALOG :    tmp=tmpList.GetHead();
			                  while(tmp!=NULL)
					 {
					     SendDlgItemMessage(hFItem,IDD_LIST,LB_ADDSTRING,0,(LPARAM)tmp->name);  // вар 1
		                                        SendMessage(hFItem,LB_ADDSTRING,0,(LPARAM)tmp->name);      // вар 2
					     tmp=tmp->Next;
					  }
			               
			                  break;

		 case WM_COMMAND : switch(LOWORD(wParam))
						   {
		                      
							   case IDD_DEL : break;
							   case IDD_INFO :  ofn.InitOFN();
								                GetOpenFileNameW(&ofn.GetOFN());
												break;
							   case IDD_CANCEL :
							   case IDD_OK :
							   case WM_DESTROY : EndDialog(hFItem,0);
								                 break;
							   default : return DefWindowProc(hFItem, msgFItem, wParam, lParam);
						   }
	}
	return 0;
};


Подскажите что я делаю не так или как правильно создать листбокс

Последний раз редактировалось counter; 09.02.2009 в 23:27.
counter вне форума Ответить с цитированием
Старый 10.02.2009, 23:34   #10
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

c# или с++ - корявый язык, если не трудно можно объяснить?

Код:
HDC hdcFItem;
	hdcFItem=GetDC(hFItem);
	TextOut(hdcFItem,40,24,L"Name   ",7);
	TextOut(hdcFItem,40,65,L"Phone  ",7);
	TextOut(hdcFItem,40,106,L"Adress ",7);
	TextOut(hdcFItem,40,147,L"E-Mail ",7);
	TextOut(hdcFItem,40,188,L"Site   ",7);
	TextOut(hdcFItem,40,229,L"Work   ",7);
	ReleaseDC(hFItem,hdcFItem);
1)Вы отрисовываете текст при каждом вызове процедуры диалога?

Код:
case WM_INITDIALOG :    tmp=tmpList.GetHead();
			                  while(tmp!=NULL)
					 {
					     SendDlgItemMessage(hFItem,IDD_LIST,LB_ADDSTRING,0,(LPARAM)tmp->name);
2) У Вас выполняется условие while(tmp!=NULL)? Стоит проверить, потому что вызов SendDlgMessage - вроде верный.

3) Что значит не работает инициализация листбокса? Он не заполняется, не создается или заполняется, но не полностью?
Д'якон вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListBox Shouldercannon Общие вопросы Delphi 15 08.01.2010 12:11
listbox blackstersl Общие вопросы Delphi 7 17.09.2008 23:15
ListBox werser Помощь студентам 1 29.05.2008 22:32
Listbox Dexic Помощь студентам 1 24.06.2007 15:05