Ejemplo WinApi32 GUI - conversor decimal a binario

Iniciado por david_BS, 7 Abril 2012, 06:45 AM

0 Miembros y 1 Visitante están viendo este tema.

david_BS

Hola, estaba probando mis funciones atol e ltoa personalizadas, y las puse a prueba con un programa win32 con GUI que es un convertidor básico de decimal a binario y viceversa. Voy a dejar el código del proyecto en MSVC++ 6.0 que incluye el .h con las funciones que dije.

Proyecto

y dejo el winmain.cpp a la vista para notar los cambios con mi anterior publicación para winapi32 GUI

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//
// UTN FRGP
// 2012
// David Riedel
// EMAIL: david_bs@live.com
//

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//#define WINVER 0x0500 //WINVER as 0x0500 enables features specific to Win 98 and 2000
//#define VC_EXTRALEAN

#include <windows.h>
#include <stdio.h>
//gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

#include "ansii_conversions.h"
#include "convertir.h"

/////////////////////////
// Globales

HWND EditControl1;
//HWND EditControl2;
//HWND EditControl3;
HWND ListControl1;
HWND ListControl2;
HWND StaticControl1;
HWND CheckBoxControl1;
HWND CheckBoxControl2;

const int ID_EDIT1=1, ID_LIST1=2, ID_CHECK1=3, ID_CHECK2=4;
const int ID_OK = 6;
const int ID_CANCEL = 7;
const int ID_LABEL1 = 0;

/////////////////////////////

void getCentradoGlobal(int vXY[2], int h, int w);

///////////////
// Controles de ventana

void RegistrarControlesDeVentanaPrincipal(HWND hWin)
{
static char* t1 =  TEXT("Ingrese 1 número");

unsigned long EstiloHijo1 = WS_VISIBLE | WS_CHILD;
unsigned long EstiloHijo2 = WS_CHILD | WS_VISIBLE | WS_BORDER;
unsigned long EstiloHijo3 = WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON;
unsigned long EstiloHijo4 = WS_CHILD | WS_VISIBLE | LBS_NOTIFY | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP;

unsigned long editstyle =WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP;
unsigned long liststyle =WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP| LBS_NOTIFY;

int offs = 30;
int X=20;
int Y=10;
int W=200;
int H=25;

StaticControl1 = CreateWindow( TEXT("static"),
                          t1,
  EstiloHijo1,
  20,10,180,20,
  hWin,
  (HMENU)ID_LABEL1,
  NULL,
  NULL);

EditControl1 = CreateWindow( TEXT("Edit"),
                        NULL,
editstyle,
X,
Y+20,
W+63,
H,
hWin,
(HMENU)ID_EDIT1,
NULL,
NULL);

ListControl1 = CreateWindow( TEXT("listbox"),
                        NULL,
liststyle,
X,
Y+20+(offs*1),
W+63,
H-5,
hWin,
(HMENU)ID_LIST1,
NULL,
NULL);

CheckBoxControl1 = CreateWindow( TEXT("button"),
                        "BinToDec",
WS_VISIBLE | WS_CHILD  | BS_CHECKBOX |BS_AUTOCHECKBOX,
X+160,90,84,20,
hWin,
(HMENU)ID_CHECK1,
NULL,
NULL);

CreateWindow( TEXT("button"),
         TEXT("Convertir"),
 EstiloHijo1,
 X,90,80,H,
 hWin,
 (HMENU) ID_OK,
 NULL,
 NULL);

CreateWindow( TEXT("button"),
         TEXT("Salir"),
 EstiloHijo1,
 X+100,90,50,H,
 hWin,
 (HMENU)ID_CANCEL,
 NULL,
 NULL);
}

//////////
// CallBack

INT_PTR CALLBACK WinProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
{
RegistrarControlesDeVentanaPrincipal(hWin);

SetFocus(EditControl1);
}
break;

case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_OK:
{
char chBuffer1[128];
memset(chBuffer1,0,sizeof(chBuffer1));
GetDlgItemText( hWin,ID_EDIT1, chBuffer1, sizeof( chBuffer1 ) );
BOOL checked = IsDlgButtonChecked(hWin, ID_CHECK1);
int l=strlen(chBuffer1);
if( (checked&&!EsBin(chBuffer1))  ||  (!checked&&!EsDec(chBuffer1))) {
MessageBox(0,"Errores de ingreso!","Convertidor",0);
return FALSE;
}
if(l<1){
MessageBox(0,"Ingrese algo!","Convertidor",0);
return FALSE;
}
long l_res_pre;
l_res_pre = mi_atoi(chBuffer1);
long l_res;
if(!checked) l_res = Bin(l_res_pre,2,10);//dec a bin
else l_res = Bin(l_res_pre,10,2);//bin a dec
char* ch_res = mi_ltoa(l_res,ch_res);
SendDlgItemMessage(hWin, ID_LIST1, LB_RESETCONTENT, 0, 0);
int nNum=0;
char* buf1 = (char*)GlobalAlloc(GPTR,strlen(ch_res)+1);
strcpy(buf1, ch_res);
free(ch_res);
int index1 = SendDlgItemMessage(hWin, ID_LIST1, LB_ADDSTRING, 0, (LPARAM)buf1);
SendDlgItemMessage(hWin, ID_LIST1, LB_SETITEMDATA, (WPARAM)index1, (LPARAM)nNum);
GlobalFree((HANDLE)buf1);
}
break;

case ID_CANCEL:
{
SendMessage(hWin, WM_CLOSE, 0, 0);
return TRUE;
}
break;
}
}
break;

case WM_CLOSE:
{
DestroyWindow(hWin);
return TRUE;
}
/////////////////////////////
   case WM_DESTROY:
{
PostQuitMessage(0);
return TRUE;
}

default:
return DefWindowProc(hWin,uMsg,wParam,lParam);

}

return 0;
//return DefWindowProc(hWin,uMsg,wParam,lParam);
}


////////////
// Clase de ventana

void RegistrarClaseVentana(WNDCLASS* wc)
{
// HICON hIconImg = (HICON)LoadImage(NULL, "BS.ico", IMAGE_ICON, 542, 449, LR_LOADFROMFILE);
wc->lpszClassName = TEXT("Window");
wc->hInstance     = GetModuleHandle(NULL);
   //wc->hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc->hbrBackground =  (HBRUSH)(COLOR_BTNFACE+1);
   wc->lpfnWndProc   = (WNDPROC)WinProc;
wc->style         =  CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
   wc->cbClsExtra    =  0;
   wc->cbWndExtra    =  0;
   wc->hIcon         =  LoadIcon(NULL,"IDI_ICON1");
// wc->hIcon         =  LoadIcon(NULL,"IDI_WINLOGO");
   wc->hCursor       =  LoadCursor(NULL,IDC_ARROW);
   wc->lpszMenuName  =  NULL;
RegisterClass((struct tagWNDCLASSA *)wc);
}

//////////////
// Punto de entrada ('WinMain' : must be '__stdcall')

int mb=0;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE h0, LPSTR lpCmdLine, int nCmdShow){

HWND hWin;
WNDCLASS wc = {0};

RegistrarClaseVentana(&wc);

int ancho=300;
int alto=156;
int dim[2];
getCentradoGlobal(dim, ancho, alto);

unsigned long Estilo1 = WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;

hWin = CreateWindow( wc.lpszClassName,
                "Convertidor a Binario",
Estilo1,
dim[0],
dim[1],
ancho,
alto,
NULL,
NULL,
hInst,
NULL);

// ShowWindow(hWin,nCmdShow);
ShowWindow(hWin, SW_SHOWDEFAULT);

//UpdateWindow(hWin);

MSG msg;
while(GetMessage(&msg, NULL, 0, 0)>0) {
if(!mb) {
 MessageBox(hWin, "By BS","Convertidor a Binario",MB_OK);
 mb=1;
}
if (!IsDialogMessage(hWin, &msg)) {
 TranslateMessage(&msg);
 DispatchMessage(&msg);

}
}

   return msg.wParam;
}

//===

void getCentradoGlobal(int vXY[2], int h, int w)
{
RECT rcP;
GetWindowRect(GetDesktopWindow(), &rcP);
int centerX = (rcP.right/2)-(w/2)-(w/4);
int centerY = (rcP.bottom/2)-(h/2)+(h/6);
vXY[0]=centerX;
vXY[1]=centerY;
}

//===


Prueben el convertidor XD aver si anda bien. La meta es hacerlo un convertidor de otros sistemas también, por ejemplo hexadecimal y octal. pero como se trata de algo didáctico para mi, me da lo mismo

por cierto la función conversora es esta, creo que en google aparece enseguida..

unsigned long Bin(unsigned long n1,int base1,int base2)
{
unsigned long alg,mult=1,n2=0;
while(n1 > 0) {
alg = n1 % base1;
n1 /= base1;
n2 += (alg*mult);
mult *= base2;
}
return n2;
}


Salu2