#include "commen.h"
#include "theDataRecoveryHead.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //主窗口过程函数
BOOL CreateDataRecoveryInterface(HWND hwnd); //初始化数据恢复界面
BOOL GetLogicalDriveInfoOnly(LOGICALDRIVEINFO *logicalDriveInfo,char logicalDriveNumber); //只获取逻辑驱动器信息的函数
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
InitCommonControls(); //启用视觉效果的初始化
static TCHAR szAppName[]=TEXT("DataRecovery"); //
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=szAppName;
wndclass.lpszClassName=szAppName;
//注册窗口
if (!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Program Requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
//创建窗口
hwnd=CreateWindow(szAppName,
TEXT("Roobam Smart DataRecovery V1.0"),
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
800,500,NULL,NULL,hInstance,NULL);
//显示窗口
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//static HWND hwndComboBox;//Combo box句柄
int nDrive=0; //用来统计有多少个物理驱动器
static temperaturePARAMS temperatureparmas;
switch(message)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hwndMainStatic2=CreateWindow(TEXT("STATIC"),TEXT("所有物理磁盘"),WS_CHILD|WS_VISIBLE,10,5,100,25,hwnd,NULL,hInstance,NULL);
//创建一个硬盘列表的Combo box
hwndComboBox=CreateWindow(TEXT("COMBOBOX"),NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST|CBS_HASSTRINGS,
120,5,300,80,
hwnd,NULL,
hInstance,
NULL
);
char szBuff[100]; //临时辅助变量
PHYDRIVEINFOSHORT thePhyDIS; //简短的物理驱动器信息
//获取简短的物理驱动器信息
while (GetPhysicalDriveInfoShort(&thePhyDIS,nDrive))
{
//构造要显示的字符串,包括驱动器名称,型号,容量
sprintf_s(szBuff,"%s %s (%I64d GB)",thePhyDIS.vendorId,thePhyDIS.modelNumber,thePhyDIS.size/1000/1000/1000);
//SendMessageA(hwndComboBox,CB_ADDSTRING,0,(LPARAM)&szBuff);
//发送一个消息到硬盘列表,添加一条信息
SendMessageA(hwndComboBox,CB_ADDSTRING,0,(LPARAM)szBuff);
nDrive++;
}
//添加完之后选择第0个选项
SendMessage(hwndComboBox,CB_SETCURSEL,0,0);
///创建一个"详细信息"按钮
hwndButtomMoreInfo=CreateWindow(TEXT("button"),TEXT("详细信息"),
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
430,5,80,25,
hwnd,(HMENU)1,
hInstance,
NULL
);
//创建主界面显示温度的static text
hwndTextTemperature=CreateWindow(TEXT("STATIC"),TEXT("--"),
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
600,5,150,25,
hwnd,(HMENU)2,
hInstance,
NULL
);
//temperature的初始化函数,创建一个线程和设置定时器
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
temperatureparmas.hwnd=hwndTextTemperature;
temperatureparmas.htheEvent=hEvent;
//创建线程,线程的函数是GetTemperatureThread,参数是temperatureparmas
_beginthread(GetTemperatureThread,0,&temperatureparmas);
//定时器设为30s
SetTimer(hwnd,ID_TIMER,30000,NULL);
//刚开始先获取一次温度,然后就等到Timer超时
SetEvent(hEvent);
//创建数据恢复界面
CreateDataRecoveryInterface(hwnd);
//设置控件字体
LOGFONT LogFont;
memset(&LogFont, 0, sizeof(LOGFONT));
lstrcpy(LogFont.lfFaceName,"黑体");
//创建字体
HFONT hFont;
hFont = CreateFontIndirect(&LogFont);
//设置字体
SendMessage(hwndComboBox, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndButtomMoreInfo, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndTextTemperature, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainCBLogicalDrive, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainIfFormat, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainBTNOK, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainBTNHuiFu, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainStatic1, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainStatic2, WM_SETFONT, (WPARAM)hFont, 0);
SendMessage(hwndMainStaticScanResult, WM_SETFONT, (WPARAM)hFont, 0);
//SendMessage(hwnd,WM_PAINT,0,0);
return 0;
case WM_TIMER:
//获取温度的Timer
SetEvent(hEvent);
return 0;
case WM_PAINT:
//画直线一定要在PAINT里,在Create是显示不出来的,纠结一个月的地方
LPSTR string1 ;
string1 = "神奇的分割线";
HDC hdc;
hdc = GetDC(hwnd);
//定义字体样式
LOGFONT LogFontp;
memset(&LogFontp, 0, sizeof(LOGFONT));
lstrcpy(LogFontp.lfFaceName,"黑体");
//创建字体
HFONT hFontp;
hFontp = CreateFontIndirect(&LogFontp);
SelectObject(hdc,hFontp);
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(50,255,0));
//输出文字
TextOut(hdc,320,35,string1,lstrlen(string1));
HPEN newPen,pOldPen;
newPen = CreatePen(PS_SOLID,2,RGB(0,255,0));
pOldPen = (HPEN)SelectObject(hdc,newPen); //改变颜色
MoveToEx (hdc,0,45, NULL) ;
LineTo (hdc,315,45) ;
MoveToEx (hdc,420,45, NULL) ;
LineTo (hdc,800,45) ;
SelectObject(hdc,pOldPen);
DeleteObject(newPen);
DeleteDC(hdc);
break; //就是后面这个...不能是break;是就不能刷新,又纠结了
case WM_COMMAND:
switch(LOWORD(wParam))
{
//获取更详细的物理磁盘信息
case IDM_PHYDRIVEINFOMORE:
DialogBox(hInstance,TEXT("IDD_PHYDRIVEINFOMORE"),hwnd,GetPhyDriveInfoMoreProc);
break;
//坏道检测
case IDM_THESECTORDETECTION:
DialogBox(hInstance,TEXT("IDD_SECTORDETECTION"),hwnd,SectorDetectionProc);
break;
//磁盘克隆
case IDM_SECTORCLONE:
DialogBox(hInstance,TEXT("IDD_SECTORCLONE"),hwnd,SectorCloneProc);
break;
//修复MBR
case IDM_FIXMBR:
DialogBox(hInstance,TEXT("IDD_FIXMBR"),hwnd,FixMBRProc);
break;
//修复分区表
case IDM_FIXPARTITION:
DialogBox(hInstance,TEXT("IDD_FIXPARTITION"),hwnd,FixPartitionProc);
break;
//如果详细信息按钮有消息,先查看是否给子窗口的,再判断是什么事件
case ID_BTNPHYDRIVEINFOMORE:
switch(HIWORD(wParam))
{
//按钮被单击,事件通知码为0
case BN_CLICKED:
DialogBox(hInstance,TEXT("IDD_PHYDRIVEINFOMORE"),hwnd,GetPhyDriveInfoMoreProc);
break;
}
break;
//扫描按钮
case ID_BTNSCANPARTITION:
switch(HIWORD(wParam))
{
//扫描按钮被单击了,要动作了
case BN_CLICKED:
DataRecoveryScanPartition(hwnd);
break;
}
break;
//恢复按钮有消息
case ID_BTNHuiFuData:
switch(HIWORD(wParam))
{
//恢复按钮被单击了
case BN_CLICKED:
DataRecovryHuifuData(hwnd);
break;
}
break;
//退出
case IDM_EXIT:
PostQuitMessage(0);
return 0;
}
return 0;
case WM_NOTIFY:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
/**********************************************************************************************
*获取物理驱动器详细信息窗口过程函数
**********************************************************************************************/
BOOL CALLBACK GetPhyDriveInfoMoreProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int iPhyDrive=0; //用来存放选中哪个驱动器的
//static HWND hListView1;
static PHYDRIVEINFOSMART theSMARTInfo;
static char TempChar[100]="";
switch(message)
{
case WM_INITDIALOG:
//获取主窗口中选中第几项
iPhyDrive=SendMessage(hwndComboBox,CB_GETCURSEL,0,0);
//通过SMART获取硬盘信息
if (GetPhysicalDriveInfoSMART