win32 listcontrol 排序

win32liscontrol排序问题不能用MFC... win32 liscontrol 排序问题 不能用MFC 展开
 我来答
百度网友38c8e98
2011-10-11 · TA获得超过2657个赞
知道小有建树答主
回答量:1131
采纳率:0%
帮助的人:587万
展开全部
给你一个完整的程序代码:
//用列表控件显示磁盘文件列表
//点击文件时,显示文件开头的部分,暂未兼容ANSI、UNICODE,可自行修改
//LB_DIR LB_SORT
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define ID_LISTBOX 1
#define ID_EDIT 2

#define MAXREAD 2048
#define DTFLAGS (DT_WORDBREAK|DT_EXPANDTABS|DT_NOCLIP|DT_NOPREFIX)

//全局变量
HINSTANCE hInst;
WNDPROC oldlistboxproc;//旧的列表控件消息处理函数指针

//函数声明
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);//回调函数
LRESULT CALLBACK ListProc (HWND, UINT, WPARAM, LPARAM);//新的列表控件消息处理函数

//程序入口函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;//消息结构体

//注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon =NULL;
wcex.hCursor = LoadCursor(NULL, IDC_CROSS);
wcex.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName =NULL;
wcex.lpszClassName =TEXT("javanetwork");
wcex.hIconSm =LoadIcon (NULL, IDI_APPLICATION);//LoadIcon(hInstance,LPCTSTR(IDI_APP));//
RegisterClassEx(&wcex);

//创建和显示窗口
HWND hwnd;
hInst = hInstance;//存储实例句柄

//参数:扩展样式-类名-窗口标题-窗口样式-x-y-width-height-父窗口-菜单ID-实例句柄-CREATESTURCT指针
hwnd = CreateWindowEx(NULL,TEXT("javanetwork"),TEXT("未命名"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,250,400, NULL, NULL, hInstance, NULL);

if (!hwnd)
{
return FALSE;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

//消息循环
while (1)
{
if(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))//第二个参数不能为NULL,否则关闭窗口无法正常退出
{
if(msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//空闲时间,做其他事情
}
}
return msg.wParam;
}

//回调函数,处理"javanetwork"类名创建的窗口的消息
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

int wmId, wmEvent;
static cxClient,cyClient;
static int cxChar,cyChar,cxCaps;
TEXTMETRIC textmetric;
HDC hdc;
PAINTSTRUCT ps;

static HWND hlistbox,hedit,htextedit;//窗口句柄

FILE *fp;
TCHAR szFile[MAX_PATH+1];
TCHAR str[1024];
int index;
switch (message)
{
case WM_CREATE://在此消息里初始化,如获取字体高度、宽度等
hdc=GetDC(hwnd);

GetTextMetrics(hdc,&textmetric);
cxChar=textmetric.tmAveCharWidth;
cxCaps=(textmetric.tmPitchAndFamily&1?3:2)*cxChar/2;
//对于固定宽度的字体, 大写字母的平均宽度等于cxChar。对于可变宽度字体,为cxChar乘以150%。
//对于可变宽度字体,TEXTMETRIC结构中的tmPitchAndFamily字段的低位为1,对于固定宽度字体,该值为0
cyChar=textmetric.tmHeight+textmetric.tmExternalLeading;

hlistbox=CreateWindow(TEXT("listbox"),NULL,WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER|LBS_NOTIFY,0,cyChar,cxChar*30+GetSystemMetrics(SM_CXVSCROLL),cyChar*10,hwnd,(HMENU)ID_LISTBOX,hInst,NULL);

GetCurrentDirectory(MAX_PATH+1,szFile);//MAX_PATH为路径最大长度,系统默认定义为260

//创建编辑控件,文本内容为当前目录
hedit=CreateWindow(TEXT("edit"),szFile,WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|ES_LEFT,0,0,cxChar*MAX_PATH,cyChar,hwnd,(HMENU)ID_EDIT,hInst,NULL);

htextedit=CreateWindow(TEXT("edit"),TEXT(""),WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|ES_LEFT,0,12*cyChar,cxChar*40,30*cyChar,hwnd,(HMENU)ID_EDIT,hInst,NULL);

//更改列表控件的消息处理程序
oldlistboxproc=(WNDPROC)SetWindowLong(hlistbox,GWL_WNDPROC,(LPARAM)ListProc);

//DDL_DRIVES列出驱动器[-盘符-] DDL_DIRECTORY列出[子目录]及[..] ..表示上一级目录
SendMessage(hlistbox,LB_DIR,DDL_READWRITE|DDL_READONLY|DDL_HIDDEN|DDL_DIRECTORY|DDL_SYSTEM|DDL_ARCHIVE|DDL_DRIVES,(LPARAM)TEXT("*.*")) ;
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);

EndPaint(hwnd,&ps);
break;

case WM_COMMAND:
if(LOWORD (wParam)==ID_LISTBOX&&HIWORD (wParam)==LBN_DBLCLK)//双击列表控件
{
if(LB_ERR==(index=SendMessage(hlistbox, LB_GETCURSEL,0,0)))//某个项目被选择
{
break;
}
SendMessage(hlistbox,LB_GETTEXT,index,(LPARAM)szFile);//取得被选择的项目的字符串(文件名)

if(fp=_tfopen(szFile,TEXT("rb")))//文件可以打开
{
memset(str,0,sizeof(str));
fread(str,sizeof(str)-sizeof(CHAR),1,fp);
fclose(fp);
SetWindowText(htextedit,str);

GetCurrentDirectory (MAX_PATH + 1, str);
if(str[lstrlen (str) - 1] != '\\')
{
lstrcat (str,TEXT ("\\"));
lstrcat (str,szFile);
}
SetWindowText (hedit,str) ;

}
else
{
SetWindowText(htextedit,TEXT(""));
if(*szFile=='['&&*(szFile+_tcslen(szFile)-1)==']')
{
if(*(szFile+1)=='-'&&*(szFile+_tcslen(szFile)-2)=='-')//磁盘
{
*(szFile+3)=':';
*(szFile+4)='\\';
*(szFile+5)='\0';
if(!SetCurrentDirectory(szFile+2))
{
MessageBox(NULL,szFile+2,TEXT("无法打开磁盘:"),MB_OK);
return 0;
}
}
else//上一级目录、子目录
{
*(szFile+_tcslen(szFile)-1)='\0';
if(!SetCurrentDirectory(szFile+1))
{
MessageBox(NULL,szFile+1,TEXT("无法打开目录:"),MB_OK);
return 0;
}
}
SendMessage (hlistbox, LB_RESETCONTENT, 0, 0) ;
SendMessage (hlistbox, LB_DIR,DDL_READWRITE|DDL_READONLY|DDL_HIDDEN|DDL_SYSTEM|DDL_DIRECTORY|DDL_ARCHIVE|DDL_DRIVES,(LPARAM) TEXT ("*.*"));
}
else
{
MessageBox(NULL,TEXT("文件正在使用或无法打开"),TEXT("ERROR!"),MB_OK);
}
GetCurrentDirectory (MAX_PATH + 1, str);
SetWindowText (hedit,str) ;
}
}
break;

case WM_SIZE://比GetClientRect好用
cxClient=LOWORD(lParam);//客户区的宽度
cyClient=HIWORD(lParam);//客户区的宽度
break;

case WM_DESTROY://销毁窗口
PostQuitMessage(0);//发送WM_QUIT结束程序
break;

case WM_SETFOCUS:
SetFocus(hlistbox);
return 0;

default:
return DefWindowProc(hwnd, message, wParam, lParam);//调用系统定义的缺省的消息处理函数
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

LRESULT CALLBACK ListProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
if (message == WM_KEYDOWN && wParam == VK_RETURN)//回车键
{
//提供双击的键盘接口
SendMessage(GetParent(hwnd),WM_COMMAND,MAKELONG(ID_LISTBOX,LBN_DBLCLK),(LPARAM)hwnd);
}
return CallWindowProc (oldlistboxproc, hwnd, message, wParam, lParam);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式