Ir al contenido



Foto

[MULTILENGUAJE] Como colocar las flechitas que indican el orden de columnas de un ListView


  • Por favor identifícate para responder
7 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.852 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2015 - 04:32

Windows tiene previsto un sistema con unos iconos que indican el orden en las columnas de un ListView, ascendente o descendente. No conozco si las últimas versiones de delphi lo incluyen, hasta la versión 7 no es así, de modo que me puse a trabajar en este truco, a raiz de una pregunta similar en un foro dedicado a Builder en el que suelo participar.
 
Esta sería la versión para delphi:

delphi
  1. procedure SetSortIcon(List: TListView; ColumnIndex: integer; Ascending: integer);
  2. const
  3. HDF_SORTDOWN = $0200;
  4. HDF_SORTUP = $0400;
  5. var
  6. hHeader: THANDLE;
  7. HD: HD_ITEM;
  8. begin
  9. hHeader := SendMessage(List.Handle, LVM_GETHEADER, 0, 0);
  10. HD.mask:= HDI_FORMAT;
  11. SendMessage(hHeader, HDM_GETITEM, ColumnIndex, Integer(@HD));
  12. if Ascending = 0 then
  13. HD.fmt:= (HD.fmt and not HDF_SORTUP) or HDF_SORTDOWN
  14. else
  15. HD.fmt:= (HD.fmt and not HDF_SORTDOWN) or HDF_SORTUP;
  16. SendMessage(hHeader, HDM_SETITEM, ColumnIndex, Integer(@HD));
  17. end;

 
 
La forma de uso:

delphi
  1. procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
  2. var
  3. i: integer;
  4. begin
  5. Column.Tag:= Column.Tag xor 1; // 0 descendente y 1 ascendente
  6. SetSortIcon(ListView1, Column.Index, Column.Tag);
  7.  
  8. // Aquí se implementaría la llamada a la función de ordenación de la columna
  9. TListView(Sender).CustomSort(@SortByColumn, Column.Index);
  10. end;

 
Se debe incluir le archivo de recursos para WinXP para que funcione. 
 

Saludos.
  • 5

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.852 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2015 - 04:34

Y esta es la versión para Builder C/C++
 

cpp
  1. #define HDF_SORTDOWN 0x0200
  2. #define HDF_SORTUP 0x0400
  3.  
  4. void SetSortIcon(TListView *ListView, int ColumnIndex, BOOL Ascending)
  5. {
  6. HANDLE hHeader;
  7. HD_ITEM HD;
  8.  
  9. hHeader = (HANDLE)SendMessage(ListView->Handle, LVM_GETHEADER, 0, 0);
  10. HD.mask = HDI_FORMAT;
  11. SendMessage(hHeader, HDM_GETITEM, ColumnIndex, DWORD(&HD));
  12.  
  13. if(Ascending == 1)
  14. HD.fmt = (HD.fmt & ~HDF_SORTUP) | HDF_SORTDOWN;
  15. else
  16. HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP;
  17.  
  18. SendMessage(hHeader, HDM_SETITEM, ColumnIndex, DWORD(&HD));
  19. }


La forma de uso:

cpp
  1. void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
  2. {
  3. Column->Tag ^= 1; // Guardamos eun el tag 1 ó 0 para indicar el orden
  4. SetSortIcon(ListView1, Column->Index, Column->Tag);
  5.  
  6. // Ordenamos según convenga... esto no está implementado
  7. TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);
  8. }


Si usáis un BCB antiguo, no olvidéis incluir un archivo de recursos XP.rc


Saludos.
  • 3

#3 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 16 septiembre 2015 - 07:27

Excelente como siempre, este en particular me viene muy bien!!

 

Estas a full con los trucos ultimamente  :ap:  :ap:  :ap:


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.852 mensajes
  • LocationMadrid - España

Escrito 20 septiembre 2015 - 11:00

El ListView en delphi (y Builder) borra las flechitas de este truco al redimensionar el botón de la cabecera de la columna, si queremos que no ocurra hay que complicarse un poquito más la vida.
 
Os propongo el código siguiente que realiza un Hook a la función de tratamiento de mensajes del ListView para capturar la notificación y restaurar la flechita. El código es una clase, deberá crearse un objeto para cada ListView que se desee controlar.


delphi
  1. unit SortIcon;
  2.  
  3. //--------------------------------------------------------------------------------------------------
  4. // TSortIcon (Versión Hook estilo C++)
  5. // escafandra 2015
  6. // Clase para manejo de las flechitas de orden en las cabeceras de las columnas
  7. // de un ListView
  8.  
  9. interface
  10.  
  11. uses Windows, Messages, CommCtrl;
  12.  
  13. const
  14. SI_Descendign = 0;
  15. SI_Ascendign = 1;
  16. SI_Erase = 2;
  17.  
  18. type
  19. TSortIcon = class
  20. private
  21. hListView: THANDLE;
  22. HDFocus: HD_ITEM;
  23. FocusIndex: integer;
  24. OldListViewProc: Pointer;
  25. function ListViewProc(Handle: HWND; Msg: DWORD; WParam: DWORD; LParam: DWORD): DWORD; stdcall;
  26. public
  27. destructor Destroy; override;
  28. procedure SetSortIcon(Value: DWORD);
  29. procedure SetHandle(Handle: THANDLE);
  30. end;
  31.  
  32. implementation
  33.  
  34.  
  35. function DefListViewProc(Handle: HWND; Msg: DWORD; WParam: DWORD; LParam: DWORD): DWORD; stdcall;
  36. var
  37. pSortIcon: TSortIcon;
  38. begin
  39. pSortIcon:= TSortIcon(GetWindowLong(Handle, GWL_USERDATA));
  40. if pSortIcon <> nil then
  41. Result:= pSortIcon.ListViewProc(Handle, Msg, WParam, LParam)
  42. else
  43. Result:= DefWindowProc(Handle, Msg, WParam, LParam);
  44. end;
  45.  
  46. function TSortIcon.ListViewProc(Handle: HWND; Msg: DWORD; WParam: DWORD; LParam: DWORD): DWORD; stdcall;
  47. begin
  48. if (Msg = WM_NOTIFY) and (LParam <> 0) then
  49. begin
  50. if PNMHDR(LParam).code = NM_RELEASEDCAPTURE then
  51. SendMessage(PNMHDR(LParam).hwndFrom, HDM_SETITEM, FocusIndex, DWORD(@HDFocus));
  52. end;
  53. Result:= CallWindowProc(OldListViewProc, Handle, Msg, WParam, LParam);
  54. end;
  55.  
  56. procedure TSortIcon.SetSortIcon(Value: DWORD);
  57. const
  58. HDF_SORTDOWN = $0200;
  59. HDF_SORTUP = $0400;
  60. var
  61. hHeader: THANDLE;
  62. HD: HD_ITEM;
  63. HTI: HD_HITTESTINFO;
  64. i: integer;
  65. ColumCount: integer;
  66. ColumnIndex: integer;
  67. begin
  68. if (hListView = 0) or (hListView = INVALID_HANDLE_VALUE) then exit;
  69.  
  70. Windows.GetCursorPos(HTI.Point);
  71. Windows.ScreenToClient(hListView, HTI.Point);
  72. hHeader:= SendMessage(hListView, LVM_GETHEADER, 0, 0);
  73. ColumCount:= SendMessage(hHeader, HDM_GETITEMCOUNT, 0, 0);
  74. ColumnIndex:= SendMessage(hHeader, HDM_HITTEST, 0, DWORD(@HTI));
  75. if HTI.flags <> HHT_ONDIVIDER then FocusIndex:= ColumnIndex;
  76.  
  77. for i:= 0 to ColumCount - 1 do
  78. begin
  79. HD.mask:= HDI_FORMAT;
  80. SendMessage(hHeader, HDM_GETITEM, i, Integer(@HD));
  81. if i = FocusIndex then
  82. begin
  83. if Value = SI_Ascendign then
  84. HD.fmt:= (HD.fmt and not HDF_SORTDOWN) or HDF_SORTUP
  85. else if Value = SI_Descendign then
  86. HD.fmt:= (HD.fmt and not HDF_SORTUP) or HDF_SORTDOWN;
  87. HDFocus:= HD;
  88. end
  89. else
  90. // borra la flechita de los demás...
  91. HD.fmt:= HD.fmt and not(HDF_SORTUP or HDF_SORTDOWN);
  92. SendMessage(hHeader, HDM_SETITEM, i, Integer(@HD));
  93. end;
  94. end;
  95.  
  96. procedure TSortIcon.SetHandle(Handle: THANDLE);
  97. begin
  98. if (hListView <> 0) or (Handle = INVALID_HANDLE_VALUE) or (Handle = 0) then
  99. if hListView <> 0 then
  100. begin
  101. SetWindowLong(hListView, GWL_USERDATA, 0);
  102. SetWindowLong(hListView, GWL_WNDPROC, LongInt(OldListViewProc));
  103. SetSortIcon(SI_Erase);
  104. hListView:= 0;
  105. end;
  106.  
  107. if (Handle <> INVALID_HANDLE_VALUE) and (Handle <> 0) then
  108. begin
  109. hListView:= Handle;
  110. SetWindowLong(hListView, GWL_USERDATA, LongInt(self));
  111. OldListViewProc:= Pointer(SetWindowLong(hListView, GWL_WNDPROC, LongInt(@DefListViewProc)));
  112. end;
  113. end;
  114.  
  115. destructor TSortIcon.Destroy;
  116. begin
  117. SetHandle(0);
  118. end;
  119.  
  120. end.

 


El ejemplo de uso:


delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3. SI1:= TSortIcon.Create;
  4. SI1.SetHandle(ListView1.Handle);
  5. end;
  6.  
  7. procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
  8. const
  9. {$J+}
  10. LastColumnIndex: integer = -1;
  11. {$J-}
  12. var
  13. i: integer;
  14. begin
  15. if LastColumnIndex = Column.Index then
  16. Column.Tag:= Column.Tag xor 1; // Guardamos eun el tag 1 ó 0 para indicar el orden
  17. LastColumnIndex:= Column.Index;
  18. SI1.SetSortIcon(Column.Tag); // Selecionamos la flechita (0: abajo, 1: arriba, 2: borrar
  19.  
  20. // Aquí procedemos a ordenar
  21. end;

Las características:
1. Puede manejar tantos ListView como queramos.
2. Es API pura, con lo que su uso se puede extender a ListView que no sean VCL
3. Admite FullDrag:= true para trasladar las columnas de sitio.
4. No se borra la flechita al redimensionar una columna.
5. No se puede asignar un ListView a dos TSortIcon.
6. Se puede usar como base para crear otra clase que maneje todos los ListView de un formulario
 
Espero que sea de utilidad.


Saludos.


  • 1

#5 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.852 mensajes
  • LocationMadrid - España

Escrito 20 septiembre 2015 - 11:23

El mismo código en C++
 

cpp
  1. //------------------------------------------------------------------------------
  2. // TSortIcon
  3. // escafandra 2015
  4. // Clase para manejo de las flechitas de orden en las cabeceras de las columnas
  5. // de un ListView
  6.  
  7.  
  8. #ifndef SortIconCPP
  9. #define SortIconCPP
  10.  
  11. #include <Windows.h>
  12.  
  13. #define HDF_SORTDOWN 0x0200
  14. #define HDF_SORTUP 0x0400
  15.  
  16. #define SI_Descendign 0
  17. #define SI_Ascendign 1
  18. #define SI_Erase 2
  19.  
  20. typedef int (__stdcall *PLRESULT)();
  21.  
  22. class TSortIcon
  23. {
  24. private:
  25. HANDLE hListView;
  26. HDITEM HDFocus;
  27. int FocusIndex;
  28. PLRESULT OldListViewProc;
  29.  
  30. static LRESULT __stdcall DefListViewProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
  31. {
  32. TSortIcon* pSortIcon = (TSortIcon*)GetWindowLongPtr(hWnd, GWL_USERDATA);
  33. if(pSortIcon)
  34. return pSortIcon->ListViewProc(hWnd, Msg, WParam, LParam);
  35. else return DefWindowProc(hWnd, Msg, WParam, LParam);
  36. }
  37.  
  38. LRESULT __stdcall ListViewProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
  39. {
  40. if(Msg == WM_NOTIFY && LParam){
  41. if(((NMHDR*)(LParam))->code == NM_RELEASEDCAPTURE)
  42. SendMessage(((NMHDR*)(LParam))->hwndFrom, HDM_SETITEM, FocusIndex, DWORD(&HDFocus));
  43. }
  44. return CallWindowProc(OldListViewProc, hWnd, Msg, WParam, LParam);
  45. }
  46.  
  47. public:
  48. void SetSortIcon(DWORD Value)
  49. {
  50. int ColumCount;
  51. int ColumnIndex;
  52. HANDLE hHeader;
  53. HD_ITEM HD;
  54. HDHITTESTINFO HTI;
  55.  
  56. GetCursorPos(&(HTI.pt));
  57. ::ScreenToClient(hListView, &(HTI.pt));
  58.  
  59. hHeader = (HANDLE)SendMessage(hListView, LVM_GETHEADER, 0, 0);
  60. ColumCount = SendMessage(hHeader, HDM_GETITEMCOUNT, 0, 0);
  61. ColumnIndex = SendMessage(hHeader, HDM_HITTEST, 0, DWORD(&HTI));
  62. if(HTI.flags != HHT_ONDIVIDER) FocusIndex = ColumnIndex;
  63.  
  64. for(int i = 0; i < ColumCount; i++){
  65. HD.mask = HDI_FORMAT;
  66. SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));
  67. if(i == FocusIndex){
  68. if(Value == SI_Ascendign)
  69. HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP;
  70. else if(Value == SI_Descendign)
  71. HD.fmt = (HD.fmt & ~HDF_SORTUP) | HDF_SORTDOWN;
  72. HDFocus = HD;
  73. }
  74. else
  75. HD.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);
  76. SendMessage(hHeader, HDM_SETITEM, i, DWORD(&HD));
  77. }
  78. }
  79.  
  80. void SetHandle(HANDLE HListView)
  81. {
  82. if(hListView || HListView == INVALID_HANDLE_VALUE || !HListView)
  83. if(hListView){
  84. SetWindowLong(hListView, GWL_USERDATA, 0);
  85. SetWindowLong(hListView, GWL_WNDPROC, (LONG)OldListViewProc);
  86. SetSortIcon(3);
  87. hListView = 0;
  88. }
  89. if(HListView != INVALID_HANDLE_VALUE && HListView){
  90. hListView = HListView;
  91. SetWindowLongPtr(hListView, GWL_USERDATA, (LONG)this);
  92. OldListViewProc = (PLRESULT)SetWindowLongPtr(hListView, GWL_WNDPROC, (LONG)TSortIcon::DefListViewProc);
  93. }
  94. }
  95.  
  96. ~TSortIcon() {SetHandle(0);}
  97. };
  98. #endif


Saludos.
  • 1

#6 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.852 mensajes
  • LocationMadrid - España

Escrito 23 septiembre 2015 - 02:57

Os dejo otra versión de la Clase TSortIcon que me gusta más que la que publiqué hace unos días. Realiza el hook subclassing a la función de tratamiento de mensajes del ListView_Header, en lugar de a la del ListView, disponiendo de un mayor control y simplicidad.
 


delphi
  1. unit SortIcon;
  2.  
  3. //--------------------------------------------------------------------------------------------------
  4. // TSortIcon (Versión Hook estilo C++)
  5. // escafandra 2015
  6. // Clase para manejo de las flechitas de orden en las cabeceras de las columnas
  7. // de un ListView
  8.  
  9. interface
  10.  
  11. uses Windows, Messages, CommCtrl;
  12.  
  13. const
  14. HDF_SORTDOWN = $0200;
  15. HDF_SORTUP = $0400;
  16.  
  17.  
  18. SI_Descendign = 0;
  19. SI_Ascendign = 1;
  20. SI_Erase = 2;
  21.  
  22. type
  23. TSortIcon = class
  24. private
  25. hHeader: THANDLE;
  26. Focusfmt: integer;
  27. FocusIndex: integer;
  28. OldHeaderProc: Pointer;
  29. function HeaderProc(Handle: HWND; Msg: DWORD; WParam: Longint; LParam: Longint): Longint; stdcall;
  30. public
  31. destructor Destroy; override;
  32. procedure SetSortIcon(Value: DWORD);
  33. procedure SetHandle(hListView: THANDLE);
  34. end;
  35.  
  36. implementation
  37.  
  38.  
  39. function DefHeaderProc(Handle: HWND; Msg: DWORD; WParam: Longint; LParam: Longint): Longint; stdcall;
  40. var
  41. pSortIcon: TSortIcon;
  42. begin
  43. pSortIcon:= TSortIcon(GetWindowLong(Handle, GWL_USERDATA));
  44. if pSortIcon <> nil then
  45. Result:= pSortIcon.HeaderProc(Handle, Msg, WParam, LParam)
  46. else
  47. Result:= DefWindowProc(Handle, Msg, WParam, LParam);
  48. end;
  49.  
  50. function TSortIcon.HeaderProc(Handle: HWND; Msg: DWORD; WParam: Longint; LParam: Longint): Longint; stdcall;
  51. begin
  52. if ((Msg = HDM_SETITEMW) or (Msg = HDM_SETITEMA)) and (WParam = FocusIndex) and (LParam <> 0) then
  53. PHDITEM(LParam).fmt:= PHDITEM(LParam).fmt or Focusfmt;
  54. Result:= CallWindowProc(OldHeaderProc, Handle, Msg, WParam, LParam);
  55. end;
  56.  
  57. procedure TSortIcon.SetSortIcon(Value: DWORD);
  58. var
  59. HD: HD_ITEM;
  60. HTI: HD_HITTESTINFO;
  61. i: integer;
  62. ColumCount: integer;
  63. ColumnIndex: integer;
  64. begin
  65. if (hHeader = 0) or (hHeader = INVALID_HANDLE_VALUE) then exit;
  66.  
  67. // Busco el ItemHeader con foco
  68. Windows.GetCursorPos(HTI.Point);
  69. Windows.ScreenToClient(hHeader, HTI.Point);
  70. ColumnIndex:= SendMessage(hHeader, HDM_HITTEST, 0, DWORD(@HTI));
  71. if HTI.flags <> HHT_ONDIVIDER then FocusIndex:= ColumnIndex;
  72.  
  73. ColumCount:= SendMessage(hHeader, HDM_GETITEMCOUNT, 0, 0);
  74. for i:= 0 to ColumCount - 1 do
  75. begin
  76. HD.mask:= HDI_FORMAT;
  77. SendMessage(hHeader, HDM_GETITEM, i, Integer(@HD));
  78. HD.fmt:= HD.fmt and not(HDF_SORTUP or HDF_SORTDOWN);
  79. if i = FocusIndex then
  80. begin
  81. if Value = SI_Ascendign then
  82. Focusfmt:= HDF_SORTUP
  83. else if Value = SI_Descendign then
  84. Focusfmt:= HDF_SORTDOWN;
  85. HD.fmt:= HD.fmt or Focusfmt;
  86. end;
  87. CallWindowProc(OldHeaderProc, hHeader, HDM_SETITEM, i, LongInt(@HD));
  88. //SendMessage(hHeader, HDM_SETITEM, i, LongInt(@HD));
  89. end;
  90. end;
  91.  
  92. procedure TSortIcon.SetHandle(hListView: THANDLE);
  93. begin
  94. if hListView <> INVALID_HANDLE_VALUE then
  95. begin
  96. if (hHeader <> 0) or (hListView = 0) then
  97. begin
  98. SetWindowLong(hHeader, GWL_USERDATA, 0);
  99. SetWindowLong(hHeader, GWL_WNDPROC, LongInt(OldHeaderProc));
  100. SetSortIcon(SI_Erase);
  101. hHeader:= 0;
  102. end;
  103. if hListView <> 0 then
  104. begin
  105. hHeader:= SendMessage(hListView, LVM_GETHEADER, 0, 0);
  106. SetWindowLong(hHeader, GWL_USERDATA, LongInt(self));
  107. OldHeaderProc:= Pointer(SetWindowLong(hHeader, GWL_WNDPROC, LongInt(@DefHeaderProc)));
  108. end;
  109. end;
  110. end;
  111.  
  112. destructor TSortIcon.Destroy;
  113. begin
  114. SetHandle(0);
  115. end;
  116.  
  117. end.

 
 
Las características:
1. Puede manejar tantos ListView como queramos.
2. Es API pura, con lo que su uso se puede extender a ListView que no sean VCL
3. Admite FullDrag:= true para trasladar las columnas de sitio.
4. No se borra la flechita al redimensionar una columna con el ratón o por código.
5. No se puede asignar un ListView a dos TSortIcon.
6. Se puede usar como base para crear otra clase que maneje todos los ListView de un formulario.

 
Saludos.

Archivos adjuntos


  • 1

#7 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.852 mensajes
  • LocationMadrid - España

Escrito 23 septiembre 2015 - 03:00

Esta es la versión para C++
 

cpp
  1. //------------------------------------------------------------------------------
  2. // TSortIcon
  3. // escafandra 2015
  4. // Clase para manejo de las flechitas de orden en las cabeceras de las columnas
  5. // de un ListView
  6.  
  7.  
  8. #ifndef SortIconCPP
  9. #define SortIconCPP
  10.  
  11. #include <Windows.h>
  12.  
  13. #define HDF_SORTDOWN 0x0200
  14. #define HDF_SORTUP 0x0400
  15.  
  16. #define SI_Descendign 0
  17. #define SI_Ascendign 1
  18. #define SI_Erase 2
  19.  
  20. typedef int (__stdcall *PLRESULT)();
  21.  
  22. class TSortIcon
  23. {
  24. private:
  25. HANDLE hHeader;
  26. int Focusfmt;
  27. int FocusIndex;
  28. PLRESULT OldHeaderProc;
  29.  
  30. static LRESULT __stdcall DefHeaderProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
  31. {
  32. TSortIcon* pSortIcon = (TSortIcon*)GetWindowLongPtr(hWnd, GWL_USERDATA);
  33. if(pSortIcon)
  34. return pSortIcon->HeaderProc(hWnd, Msg, WParam, LParam);
  35. else return DefWindowProc(hWnd, Msg, WParam, LParam);
  36. }
  37.  
  38. LRESULT __stdcall HeaderProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
  39. {
  40. if((Msg == HDM_SETITEMW || Msg == HDM_SETITEMA) && WParam == WPARAM(FocusIndex) && LParam)
  41. LPHDITEM(LParam)->fmt |= Focusfmt;
  42. return CallWindowProc(OldHeaderProc, hWnd, Msg, WParam, LParam);
  43. }
  44.  
  45. public:
  46. void SetSortIcon(DWORD Value)
  47. {
  48. int ColumCount;
  49. int ColumnIndex;
  50. HDITEM HD;
  51. HDHITTESTINFO HTI;
  52.  
  53. if (!hHeader || hHeader == INVALID_HANDLE_VALUE) return;
  54.  
  55. // Busco el ItemHeader con foco
  56. GetCursorPos(&(HTI.pt));
  57. ::ScreenToClient(hHeader, &(HTI.pt));
  58. ColumnIndex = SendMessage(hHeader, HDM_HITTEST, 0, DWORD(&HTI));
  59. if(HTI.flags != HHT_ONDIVIDER) FocusIndex = ColumnIndex;
  60.  
  61. ColumCount = SendMessage(hHeader, HDM_GETITEMCOUNT, 0, 0);
  62. for(int i = 0; i < ColumCount; i++){
  63. HD.mask = HDI_FORMAT;
  64. SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));
  65. HD.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);
  66. if(i == FocusIndex){
  67. if(Value == SI_Ascendign)
  68. Focusfmt = HDF_SORTUP;
  69. else if(Value == SI_Descendign)
  70. Focusfmt = HDF_SORTDOWN;
  71. HD.fmt |= Focusfmt;;
  72. }
  73. CallWindowProc(OldHeaderProc, hHeader, HDM_SETITEM, i, LPARAM(&HD));
  74. //SendMessage(hHeader, HDM_SETITEM, i, LPARAM(&HD));
  75. }
  76. }
  77.  
  78. void SetHandle(HANDLE hListView)
  79. {
  80. if(hListView != INVALID_HANDLE_VALUE){
  81. if(hHeader || !hListView){
  82. SetWindowLong(hHeader, GWL_USERDATA, 0);
  83. SetWindowLong(hHeader, GWL_WNDPROC, (LONG)OldHeaderProc);
  84. SetSortIcon(SI_Erase);
  85. hHeader = 0;
  86. }
  87. if(hListView){
  88. hHeader = (HANDLE)SendMessage(hListView, LVM_GETHEADER, 0, 0);
  89. SetWindowLongPtr(hHeader, GWL_USERDATA, (LONG)this);
  90. OldHeaderProc = (PLRESULT)SetWindowLongPtr(hHeader, GWL_WNDPROC, (LONG)TSortIcon::DefHeaderProc);
  91. }
  92. }
  93. }
  94.  
  95. ~TSortIcon() {SetHandle(0);}
  96. };
  97. #endif


Saludos.

Archivos adjuntos


  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 23 septiembre 2015 - 07:41

Gracias por el aporte amigo.


  • 0